2016-11-15 161 views
0

爲什麼lst.reverse()lst[::-1]快得多?似乎有在兩者的Python 3和2爲什麼「lst.reverse()」比「lst [:: - 1]」快得多?

實施例大的時間差(Python的3.5)隔開

>>> from timeit import timeit 
>>> lst = list('Crooked Hillary!') * 1000 
>>> def TrumpWins(lst): 
... lst.reverse() 
... return lst 
... 
>>> def SecondPlace(lst): 
... return lst[::-1] 
... 
>>> timeit(lambda: TrumpWins(lst), number=100000) 
0.7976173080969602 
>>> timeit(lambda: SecondPlace(lst), number=100000) 
4.703373569995165 
+5

你剛剛發佈這個是爲了讓它驚人嗎? – deceze

+1

我會說'reverse'使用編譯過的'for',但是'lst [:: - 1]'調用了一個未編譯好的'...',但我可能完全錯誤。順便說一句,你很可能被這樣的帳戶名稱禁止。 –

+3

沒有贏得這裏的熱門投票 – EdChum

回答

13

笑話。

lst[::-1]返回一個新列表,而list.reverse只是執行列表的逆轉。額外的開銷來自創建一個新列表。而成本/開銷將與您試圖扭轉的列表長度成比例增長。

一個更公平的比較,可能會調用reverse方法之前列表複製:

In [14]: l = [1]*1000 

In [15]: %%timeit 
    ....: l[::-1] 
    ....: 
100000 loops, best of 3: 5.64 µs per loop 

In [16]: %%timeit 
    ....: l[:].reverse() 
    ....: 
100000 loops, best of 3: 6.27 µs per loop 

約合時序,與reverse在這種情況下輸給了由於方法調用的額外開銷,作爲對第一種情況是使用語言結構。

相關問題