我想看看使用reduce在简单的数值运算中比使用for循环更快多少。这是我发现的结果(使用标准的timeit库):
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比使用for循环更快,但函数调用似乎占主导地位。reduce版本不应该几乎完全在C中运行吗? 在for循环版本中使用iadd(c,i)使其运行时间为约24秒。为什么使用operator.add比+慢得多? 我的理解是+和operator.add运行相同的C代码(我检查了一下确保operator.add没有在Python中调用+或任何其他内容)。
顺便说一句,只使用sum的运行时间大约为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