用Python编写大型CSV的最快方法

2024-06-09 09:04:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在csv文件中写一些随机的样本数据,直到它是1GB大。以下代码正在工作:

import numpy as np
import uuid
import csv
import os
outfile = 'data.csv'
outsize = 1024 # MB
with open(outfile, 'ab') as csvfile:
    wtr = csv.writer(csvfile)
    while (os.path.getsize(outfile)//1024**2) < outsize:
        wtr.writerow(['%s,%.6f,%.6f,%i' % (uuid.uuid4(), np.random.random()*50, np.random.random()*50, np.random.randint(1000))])    

怎样才能更快?


Tags: 文件csv数据csvfile代码importuuidos
2条回答

问题似乎主要是IO绑定的。您可以通过以较大的块写入文件而不是一次写入一行来稍微改进I/O:

import numpy as np
import uuid
import os
outfile = 'data-alt.csv'
outsize = 10 # MB
chunksize = 1000
with open(outfile, 'ab') as csvfile:
    while (os.path.getsize(outfile)//1024**2) < outsize:
        data = [[uuid.uuid4() for i in range(chunksize)],
                np.random.random(chunksize)*50,
                np.random.random(chunksize)*50,
                np.random.randint(1000, size=(chunksize,))]
        csvfile.writelines(['%s,%.6f,%.6f,%i\n' % row for row in zip(*data)])   

您可以尝试使用chunksize(每个块写入的行数)来查看在您的计算机上最有效的方法。


下面是一个基准,将上述代码与原始代码进行比较,outsize设置为10 MB:

% time original.py

real    0m5.379s
user    0m4.839s
sys 0m0.538s

% time write_in_chunks.py

real    0m4.205s
user    0m3.850s
sys 0m0.351s

所以这比原始代码快25%。


我试着用所需总行数的估计值替换对os.path.getsize的调用。不幸的是,它没有提高速度。由于表示最终int所需的字节数不同,估计也不精确——也就是说,它不能完全复制原始代码的行为。所以我把os.path.getsize放在原地。

删除所有不必要的内容,因此应该更快更容易理解:

import random
import uuid
outfile = 'data.csv'
outsize = 1024 * 1024 * 1024 # 1GB
with open(outfile, 'ab') as csvfile:
    size = 0
    while size < outsize:
        txt = '%s,%.6f,%.6f,%i\n' % (uuid.uuid4(), random.random()*50, random.random()*50, random.randrange(1000))
        size += len(txt)
        csvfile.write(txt)

相关问题 更多 >