确实,正如您的直觉,如果您可以将 N 减少到 1,则永远不要对磁盘进行 N 次写入操作。对于您的特定情况,让我们测量通过使用 json.dumps 将 N 减少到 1 会增加多少序列化你的测试数组:
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 倍:
8.25567383571545
1.508784956563721
如果我将数组大小增加到 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 比 writelines 快,并且像 json.dumps 这样的简单序列化方法比使用纯 python 代码的手动方法略快ie: ''.join(map(str, x))