实际上,正如您的直觉所示,如果可以将N减为1,就不要对磁盘执行N个写操作。对于您的特定情况,让我们测量一下通过使用json.dumps文件要序列化测试数组,请执行以下操作:import timeit
import json
x = []
for z in range(0, 800000):
x.append(z)
def f1():
with open("f1.txt", "w") as f:
for z in range(0, len(x)):
f.write(str(z))
def f2():
with open("f1.txt", "w") as f:
f.write(json.dumps(x))
N = 10
print(timeit.timeit('f1()', setup='from __main__ import f1', number=N))
print(timeit.timeit('f2()', setup='from __main__ import f2', number=N))
输出速度将提高约5.5倍:
^{pr2}$
如果将数组大小增加到8000000,则输出速度将提高3.6倍:82.87025446748072
22.56552114259503
如果将N=1,数组大小设为8000000,则输出速度将快3.8倍:8.355991964475688
2.227114091734297
不是说使用json.dumps文件是转储自定义数据的最佳方法,但也是一个合理的好方法。我的观点是,尽量减少磁盘操作的次数,如果可能的话,尽量减少。磁盘写入操作通常相当昂贵。在
附加信息:如果你想比较一下更快的序列化方法,我建议你看看这个article
编辑:添加了@ShadowRanger的建议,在实验中添加两个测试,比较write&writelines,给你:import timeit
import json
K = 8000000
x = []
for z in range(0, K):
x.append(z)
def f1():
with open("f1.txt", "w") as f:
for z in range(0, len(x)):
f.write(str(z))
def f2():
with open("f1.txt", "w") as f:
f.write(json.dumps(x))
def f3():
with open("f1.txt", "w") as f:
f.write(''.join(map(str, x)))
def f4():
with open("f1.txt", "w") as f:
f.writelines(map(str, x))
N = 1
print(timeit.timeit('f1()', setup='from __main__ import f1', number=N))
print(timeit.timeit('f2()', setup='from __main__ import f2', number=N))
print(timeit.timeit('f3()', setup='from __main__ import f3', number=N))
print(timeit.timeit('f4()', setup='from __main__ import f4', number=N))
输出将是:8.369193972488317
2.154246855128056
2.667741175272406
8.156553772208122
您仍然可以看到write比writeline快,以及一个简单的序列化方法json.dumps文件比使用纯python代码的手动程序稍快ie: ''.join(map(str, x))