我真的很困惑Python中的函数调用速度。第一和第二种情况,没什么意外的:
%timeit reduce(lambda res, x: res+x, range(1000))
10000次循环,最佳为3:每循环150μs
def my_add(res, x):
return res + x
%timeit reduce(my_add, range(1000))
10000次循环,最佳3次:每次循环148μs
但第三种情况对我来说很奇怪:
from operator import add
%timeit reduce(add, range(1000))
10000个循环,最佳3:每循环80.1μs
同时:
%timeit add(10, 100)
%timeit 10 + 100
10000000 loops, best of 3: 94.3 ns per loop
100000000 loops, best of 3: 14.7 ns per loop
那么,为什么第三种情况会加速约50%?
答案 0 :(得分:8)
add
在C。
>>> from operator import add
>>> add
<built-in function add>
>>> def my_add(res, x):
... return res + x
...
>>> my_add
<function my_add at 0x18358c0>
直+
更快的原因是add
仍需要调用Python VM的BINARY_ADD
指令以及执行其他一些工作,因为它是一个函数,而+
只是 BINARY_ADD
指令。
答案 1 :(得分:1)
运算符模块导出一组与Python的内部运算符对应的高效函数。例如,operator.add(x,y)等价于表达式x + y。函数名称是用于特殊类方法的函数名称;为方便起见,还提供了没有前导和尾随__的变体。
来自Python docs(强调我的)
答案 2 :(得分:0)