2010-03-08 107 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