我正在浏览某人发布的link about generators。在开始时,他比较了下面的两个函数。在他的设置中,他发现发电机的速度增加了5%。
我正在运行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 :(得分:9)
对于它的价值,演示中速度比较的主要目的是指出使用生成器不会带来巨大的性能开销。许多程序员在第一次看到生成器时,可能会开始怀疑隐藏的成本。例如,幕后会出现各种奇特的魔法吗?使用此功能会使我的程序运行速度慢两倍吗?
一般情况并非如此。该示例旨在表明生成器解决方案可以以基本相同的速度运行,如果在某些情况下不是稍快一些(尽管它取决于情况,Python的版本等)。如果您观察到两个版本之间在性能上存在巨大差异,那么这将是值得研究的事情。
答案 1 :(得分:1)
在David Beazley的链接幻灯片中,他声称所有测试都是在“OS X 10.4.11上使用Python 2.5.1”运行的,并且您说您在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。
答案 2 :(得分:0)
近半个小时后你没有答案。我发布了一些对我有意义的东西,不一定是正确的答案。我认为在将近半个小时之后,这比没有任何事情好:
第一种算法使用生成器。生成器通过从列表中加载第一个page结果(进入内存)并连续加载连续页面(进入内存)直到没有任何内容可以从输入中读取来起作用。
第二种算法使用两个生成器,每个生成器都有一个if
语句,每个循环总共进行两次比较,而不是第一次算法的一次比较。
此外,第二个算法在末尾调用sum
函数,而不是第一个算法,它只是在遇到它们时不断添加相关整数。
因此,对于足够大的输入,第二算法比第一算法具有更多的比较和额外的函数调用。这可能解释了为什么完成比第一个算法需要更长的时间。
希望这有帮助