问题似乎主要是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放在原地。