问题似乎主要受IO限制。您可以通过一次写入更大的数据块而不是逐行写入来稍微改善I/O:
import numpy as np
import uuid
import os
outfile = 'data-alt.csv'
outsize = 10
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)])
您可以尝试更改块大小(每个块写入的行数)以查看在您的计算机上效果最佳的设置。
这是一个基准测试,将上述代码与您的原始代码进行比较,其中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
的调用。 不幸的是,它并没有提高速度。由于表示最终整数所需的字节数不同,因此估计也不精确--也就是说,它不能完全复制您原始代码的行为。 所以我把os.path.getsize
留在原地。
getsize
函数,这样更快。 - Daniel