我試圖做一個純python(沒有外部依賴)元素明智的比較兩個序列。我的第一個解決方案是:地圖vs星圖的性能?
list(map(operator.eq, seq1, seq2))
後來我發現starmap
功能從itertools
,這似乎非常相似我。但在最糟糕的情況下,我的電腦速度竟然快了37%。由於這不明顯給我,我測量所需的時間從發電機獲取1元(不知道這種方式是正確的):
from operator import eq
from itertools import starmap
seq1 = [1,2,3]*10000
seq2 = [1,2,3]*10000
seq2[-1] = 5
gen1 = map(eq, seq1, seq2))
gen2 = starmap(eq, zip(seq1, seq2))
%timeit -n1000 -r10 next(gen1)
%timeit -n1000 -r10 next(gen2)
271 ns ± 1.26 ns per loop (mean ± std. dev. of 10 runs, 1000 loops each)
208 ns ± 1.72 ns per loop (mean ± std. dev. of 10 runs, 1000 loops each)
在檢索元素的第二種解決方案是24%更好的性能。之後,它們都產生list
的相同結果。但是,從什麼地方,我們及時獲得額外的13%:
%timeit list(map(eq, seq1, seq2))
%timeit list(starmap(eq, zip(seq1, seq2)))
5.24 ms ± 29.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
3.34 ms ± 84.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
我不知道如何在這樣的嵌套代碼分析的深入挖掘?所以我的問題是,爲什麼第一臺發電機在檢索和獲取list
函數中額外的13%時速度如此之快?
編輯: 我的第一個目的是爲了執行逐元素的比較,而不是all
,所以all
功能用list
替換。此替換不會影響時間比例。
在Windows 10(64位)的CPython 3.6.2
爲什麼不直接使用'SEQ1 = = seq2'? –
@Błotosmętek謝謝你的糾正!我的第一個意圖是元素比較,而不是'all',這在我的問題中並不明顯:)真的,如果你用'list'而不是'all'來代替'all',那麼次數的順序將是相同的。 – godaygo
什麼是Python版本?這是CPython嗎? – MSeifert