我想看看比使用for循環進行簡單的數值運算要快多少。這是我發現的(使用標準timeit庫):用for循環比用reduce更快地求和?
In [54]: print(setup)
from operator import add, iadd
r = range(100)
In [55]: print(stmt1)
c = 0
for i in r:
c+=i
In [56]: timeit(stmt1, setup)
Out[56]: 8.948904991149902
In [58]: print(stmt3)
reduce(add, r)
In [59]: timeit(stmt3, setup)
Out[59]: 13.316915035247803
尋找多一點:
In [68]: timeit("1+2", setup)
Out[68]: 0.04145693778991699
In [69]: timeit("add(1,2)", setup)
Out[69]: 0.22807812690734863
這是怎麼回事?很明顯,reduce的循環速度要快於,但函數調用似乎占主導地位。 Reduce版本不應該幾乎完全在C中運行?在for循環版本中使用iadd(c,i)使其運行約24秒。爲什麼使用operator.add比+慢得多?我在印象+和operator.add運行相同的C代碼(我檢查,以確保operator.add不只是在Python或任何東西中調用+)。
順便說一句,只是使用和運行在〜2.3秒。
In [70]: print(sys.version)
2.7.1 (r271:86882M, Nov 30 2010, 09:39:13)
[GCC 4.0.1 (Apple Inc. build 5494)]
使用'sum'做這項工作快4倍的事實的結果是相當多的指標,「應該做一個明顯的方式」。 – jsbueno 2011-03-25 18:42:53
@jsbbueno:是的,但我這樣做是爲了找出在序列上進行一般數字計算的最快方法。在現實世界中,我肯定會用sum來總結:D沒有嘗試過mul,但我確定結果是相似的。 – 2011-03-26 02:56:24