取消数据结构.通过调用readlines()构建

Sha*_*ane 0 python performance pickle

我有一个用例,我需要从文件中的行构建一个列表.此操作将在分布式网络上执行100次.我一直在使用以下明显的解决方案:

with open("file.txt") as f:
    ds = f.readlines()
Run Code Online (Sandbox Code Playgroud)

我只是想到,或许我最好一次创建这个列表,将其腌制成文件,然后使用该文件取消每个节点上的数据.

如果我这样做,会有任何性能提升吗?

aba*_*ert 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))
Run Code Online (Sandbox Code Playgroud)

我的'lotsalines.txt'文件就是那个源重复,直到它长655360行,或15532032字节.

Apple Python 2.7.2:

readlines:   0.640027999878
pickle.load: 2.67698192596
Run Code Online (Sandbox Code Playgroud)

而pickle文件是19464748字节.

Python.org 3.3.0:

readlines:   1.5357899703085423
pickle.load: 1.5975534357130527
Run Code Online (Sandbox Code Playgroud)

它是20906546字节.

因此,Python 3 pickle比Python 2 加速了很多,至少如果你使用pickle协议3,但它仍然远不如简单快readlines.(并且readlines在3.x中已经慢了很多,并且被弃用了.)

但实际上,如果你有性能问题,你应该考虑一下你是否需要它list.快速测试表明,建立list这样大小的成本几乎是成本的一​​半readlines(list(range(655360))3.x时间,list(xrange(655360))2.x).它使用了大量的内存(实际上可能也是为什么它也很慢).如果你实际上并不需要list- 而且通常你不会 - 只是迭代文件,在需要时获取行.