我有一个用例,我需要从文件中的行构建一个列表。此操作可能会在分布式网络上执行 100 次。我一直在使用以下明显的解决方案:
with open("file.txt") as f:
ds = f.readlines()
我只是想,也许我最好创建一次这个列表,将其腌制到一个文件中,然后使用该文件来取消每个节点上的数据。
如果我这样做,会有任何性能提升吗?
我有一个用例,我需要从文件中的行构建一个列表。此操作可能会在分布式网络上执行 100 次。我一直在使用以下明显的解决方案:
with open("file.txt") as f:
ds = f.readlines()
我只是想,也许我最好创建一次这个列表,将其腌制到一个文件中,然后使用该文件来取消每个节点上的数据。
如果我这样做,会有任何性能提升吗?
如果我这样做,会有任何性能提升吗?
测试一下看看!
try:
import cPickle as pickle
except:
import pickle
import timeit
def lines():
with open('lotsalines.txt') as f:
return f.readlines()
def pickles():
with open('lotsalines.pickle', 'rb') as f:
return pickle.load(f)
ds = lines()
with open('lotsalines.pickle', 'wb') as f:
t = timeit.timeit(lambda: pickle.dump(ds, file=f, protocol=-1), number=1)
print('pickle.dump: {}'.format(t))
print('readlines: {}'.format(timeit.timeit(lines, number=10))
print('pickle.load: {}'.format(timeit.timeit(pickles, number=10))
我的“lotsalines.txt”文件就是复制的源文件,直到它长 655360 行,或 15532032 字节。
苹果 Python 2.7.2:
readlines: 0.640027999878
pickle.load: 2.67698192596
并且泡菜文件是 19464748 字节。
Python.org 3.3.0:
readlines: 1.5357899703085423
pickle.load: 1.5975534357130527
它是 20906546 字节。
因此,Python 3 的速度pickle
比 Python 2 快了很多,至少如果你使用 pickle 协议 3 的话,但它仍然远没有简单的readlines
. (并且readlines
在 3.x 中变得慢了很多,并且被弃用了。)
但实际上,如果您有性能问题,您应该list
首先考虑是否需要。快速测试表明,构建list
这种大小的 a 几乎是( 3.x中的readlines
时序, 2.x 中的时间)的一半。而且它使用了大量的内存(这实际上可能也是它很慢的原因)。如果您实际上不需要(通常不需要),只需遍历文件,根据需要获取行。list(range(655360))
list(xrange(655360))
list