2013-02-15 17 views
0

构建我有一个用例,我需要从文件中的行建立一个列表。此操作将在分布式网络上执行潜在的数百次。我一直在使用的显而易见的解决方案:取消数据结构VS.通过调用readlines()

with open("file.txt") as f: 
    ds = f.readlines() 

我只是有想法,也许我会变得更好,一旦创建这个列表,它腌制成一个文件,然后使用该文件unpickle每个数据节点。

如果我这样做会有性能增加吗?

+0

我的钱在'readlines' ...但我以前错了:) - 如果你真的必须以某种方式处理线条,那么也许腌菜会更快...... – mgilson 2013-02-15 17:41:35

+0

我其实不得不在每行上调用一个.strip() – Shane 2013-02-15 17:43:14

+3

做最简单的工作。不要浪费时间去优化它,除非它会成为瓶颈。 – 2013-02-15 17:43:45

回答

5

如果我这样做会有性能增加吗?

测试一下,看看!

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 - 通常你不会 - 只是迭代文件,根据需要获取行。

+0

感谢您对问题的实际回答,并且向我展示如何在未来的时间 – Shane 2013-02-16 03:03:52