2010-03-08 110 views
7

我正在通过某人发布的link about generators。在开始时他比较了以下两个函数。在他的设置中,他发现发电机的速度提高了5%。蟒蛇发电机速度3

我正在运行Windows XP,python 3.1.1,并且似乎无法重复结果。在使用所提供的日志和高达1GB的重复数据进行测试时,我一直将“旧方式”(logs1)显示为略快。

有人可以帮助我了解发生了什么不同吗?

谢谢!

def logs1(): 
    wwwlog = open("big-access-log") 
    total = 0 
    for line in wwwlog: 
     bytestr = line.rsplit(None,1)[1] 
     if bytestr != '-': 
      total += int(bytestr) 
    return total 

def logs2(): 
    wwwlog = open("big-access-log") 
    bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog) 
    getbytes  = (int(x) for x in bytecolumn if x != '-') 
    return sum(getbytes) 

*编辑,拷贝/粘贴

+0

在我看来,这两个功能本质上是一样的。在任何情况下,你都可以建立一个巨大的清单,而你可以使用生成器。所以我并不感到惊讶,他们跑的速度相同。 – MatrixFrog 2010-03-08 05:10:52

+0

这是有道理的,我只是好奇他为什么得到5%的速度增加,我看到一直下降1%。 – Will 2010-03-08 05:54:39

回答

8

对于它的价值,演示中速度比较的主要目的是指出使用生成器不会带来巨大的性能开销。许多程序员在第一次看到发电机时,可能会开始想知道隐藏的成本。例如,幕后有各种奇特的魔法吗?使用这个功能会让我的程序运行速度减慢两倍吗?

一般情况并非如此。这个例子是为了表明一个发生器解决方案可以以基本相同的速度运行,即使在某些情况下速度稍快(尽管取决于情况,Python版本等)。如果你观察两个版本之间的性能差异,那么这将是值得研究的。

+0

谢谢你的回复! – Will 2010-03-08 19:53:52

0

间距搞砸了你不必经过近一个半小时的答案。我发布了一些对我有意义的东西,但不一定是正确的答案。我认为在差不多半个小时后这比没有好:

第一个算法使用了一个生成器。一个生成器通过从列表中加载第一个结果(进入内存)并持续加载连续页面(到内存中),直到没有什么需要从输入中读取为止。

第二个算法使用两个生成器,每个生成器都有一个if语句,每个循环总共进行两次比较,而不是第一个算法的一个比较。

此外,第二个算法在最后调用sum函数,而不是第一个算法,它会一直添加相关整数,因为它会一直遇到它们。因此,对于足够大的输入,第二个算法比第一个算法有更多的比较和额外的函数调用。这可能可以解释为什么完成比第一个算法花费更长的时间。

希望这有助于

+0

“另外,第二个算法在最后调用sum函数,而不是第一个算法,它会在遇到它们时不断添加相关整数。”我*认为*没有什么区别,因为sum()可能不会把所有的值都放到内存中,然后添加它们。它可能在迭代时添加它们,就像其他代码一样。 – MatrixFrog 2010-03-08 06:28:26

1

在你链接到大卫Beazley的幻灯片,他指出,所有测试都运行“的Python 2.5.1 OS X 10.4.11,”你说你和运行测试Windows XP上的Python 3.1。所以,意识到你正在做一些苹果来比较桔子。我怀疑这两个变量,Python版本更重要。

Python 3是与Python 2不同的野兽。许多事情已经改变了,即使在Python 2分支中也是如此。这包括性能优化和性能回归(请参阅,例如,Beazley's own recent blog post on I/O in Python 3)。出于这个原因,Python Performance Tips页面国家明确,

应始终测试这些提示与 您的应用程序和 的Python的版本,你打算使用而不是仅仅 盲目地接受一种方法比另一种 快。

我应该指出,一个地区,你可以在发电机帮助数在减少内存消费,而不是CPU的消耗。如果您在计算或提取每件作品中的大量数据,并且以后不需要数据,则生成器将发光。有关更多详细信息,请参阅generator comprehension

+0

了解,我怀疑这是为什么我发布我使用python3。 再一次,我很好奇发生了什么不同。 – Will 2010-03-08 06:27:15

+0

很好的链接,谢谢。 – Will 2010-03-08 06:32:10

+0

如果您真的好奇,请尝试使用Python 2.6安装来运行计时测试;如果这没有什么不同,请尝试使用Python 2.5安装,并查看是否仍无法复制Beazley的结果。或者你可以像我一样懒,只需邮件Python-dev。 – gotgenes 2010-03-08 06:37:15