Python 通过调用readlines()取消对数据结构与生成的绑定
我有一个用例,需要从文件中的行构建一个列表。此操作可能在分布式网络上执行100秒。我一直在使用显而易见的解决方案:Python 通过调用readlines()取消对数据结构与生成的绑定,python,performance,pickle,Python,Performance,Pickle,我有一个用例,需要从文件中的行构建一个列表。此操作可能在分布式网络上执行100秒。我一直在使用显而易见的解决方案: with open("file.txt") as f: ds = f.readlines() 我只是想,也许我最好创建一次这个列表,将它整理成一个文件,然后使用该文件来取消每个节点上的数据粘贴 如果我这样做,性能会有所提高吗 如果我这样做,性能会有所提高吗 试试看 try: import cPickle as pickle except: import p
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字节
Apple Python 2.7.2:
readlines: 0.640027999878
pickle.load: 2.67698192596
pickle文件是19464748字节
Python.org 3.3.0:
readlines: 1.5357899703085423
pickle.load: 1.5975534357130527
它是20906546字节
因此,Python3比Python2快了很多,至少如果您使用pickle协议3,但是它仍然远没有简单的readlines
那么快。(而且,readlines
在3.x中速度慢了很多,而且被弃用。)
但是,如果你有性能方面的问题,首先应该考虑你是否需要<代码>列表>代码>。快速测试表明,构建这种大小的列表
几乎是读线
(计时list(range(655360))
在3.x中,list(xrange(655360))
在2.x中的一半成本。而且它使用了大量内存(这可能也是它速度慢的原因)。如果您实际上不需要列表
,并且通常不需要,只需在文件上迭代,获取所需的行
如果我这样做,性能会有所提高吗
试试看
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字节
Apple Python 2.7.2:
readlines: 0.640027999878
pickle.load: 2.67698192596
pickle文件是19464748字节
Python.org 3.3.0:
readlines: 1.5357899703085423
pickle.load: 1.5975534357130527
它是20906546字节
因此,Python3比Python2快了很多,至少如果您使用pickle协议3,但是它仍然远没有简单的readlines
那么快。(而且,readlines
在3.x中速度慢了很多,而且被弃用。)
但是,如果你有性能方面的问题,首先应该考虑你是否需要<代码>列表>代码>。快速测试表明,构建这种大小的
列表
几乎是读线
(计时list(range(655360))
在3.x中,list(xrange(655360))
在2.x中的一半成本。而且它使用了大量内存(这可能也是它速度慢的原因)。如果你实际上不需要列表
——通常你也不需要——只需在文件上迭代,获得你需要的行。我的钱在阅读行上
。。。但是我以前就错了:)--如果你真的必须以某种方式处理这些行,那么pickle可能会更快……我实际上必须在每一行上调用一个.strip(),做最简单的事情。不要浪费时间试图优化它,除非它会成为瓶颈。当然,它可能会因为不是最简单的CR而失败。但这仍然是一个有趣的计算机科学/Python问题,你不必称之为strip-your_list=f.read().split('\n')(假设你是为换行而剥离)我的钱在readlines
。。。但是我以前就错了:)--如果你真的必须以某种方式处理这些行,那么pickle可能会更快……我实际上必须在每一行上调用一个.strip(),做最简单的事情。不要浪费时间试图优化它,除非它会成为瓶颈。当然,它可能会因为不是最简单的CR而失败。但这仍然是一个有趣的计算机科学/Python问题,您不必调用strip-your_list=f.read().split('\n')(假设您正在为换行而剥离)感谢你对这个问题的真实回答,并向我展示了如何在未来安排时间。感谢你对这个问题的真实回答,并向我展示了如何在未来安排时间