构建我有一个用例,我需要从文件中的行建立一个列表。此操作将在分布式网络上执行潜在的数百次。我一直在使用的显而易见的解决方案:取消数据结构VS.通过调用readlines()
with open("file.txt") as f:
ds = f.readlines()
我只是有想法,也许我会变得更好,一旦创建这个列表,它腌制成一个文件,然后使用该文件unpickle每个数据节点。
如果我这样做会有性能增加吗?
构建我有一个用例,我需要从文件中的行建立一个列表。此操作将在分布式网络上执行潜在的数百次。我一直在使用的显而易见的解决方案:取消数据结构VS.通过调用readlines()
with open("file.txt") as f:
ds = f.readlines()
我只是有想法,也许我会变得更好,一旦创建这个列表,它腌制成一个文件,然后使用该文件unpickle每个数据节点。
如果我这样做会有性能增加吗?
如果我这样做会有性能增加吗?
测试一下,看看!
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比Python 2加快了pickle
,至少如果你使用pickle协议3,但它仍然远不及简单的readlines
那么快。 (并且readlines
在3.x中得到了很多缓解,并且被弃用)。
但是,如果您有性能问题,那么您应该首先考虑是否需要list
。快速测试表明,构建此大小的list
几乎是readlines
(在2.x中为3.x,list(xrange(655360))
时间为list(range(655360))
)的一半成本。它使用了大量的内存(这实际上也是为什么它也很慢)。如果你实际上并不需要list
- 通常你不会 - 只是迭代文件,根据需要获取行。
感谢您对问题的实际回答,并且向我展示如何在未来的时间 – Shane 2013-02-16 03:03:52
我的钱在'readlines' ...但我以前错了:) - 如果你真的必须以某种方式处理线条,那么也许腌菜会更快...... – mgilson 2013-02-15 17:41:35
我其实不得不在每行上调用一个.strip() – Shane 2013-02-15 17:43:14
做最简单的工作。不要浪费时间去优化它,除非它会成为瓶颈。 – 2013-02-15 17:43:45