Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过调用readlines()取消对数据结构与生成的绑定_Python_Performance_Pickle - Fatal编程技术网

Python 通过调用readlines()取消对数据结构与生成的绑定

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

我有一个用例,需要从文件中的行构建一个列表。此操作可能在分布式网络上执行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字节

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')(假设您正在为换行而剥离)感谢你对这个问题的真实回答,并向我展示了如何在未来安排时间。感谢你对这个问题的真实回答,并向我展示了如何在未来安排时间