Python函数调用速度

时间:2013-11-18 15:39:09

标签: python optimization

我真的很困惑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%?

3 个答案:

答案 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)

operator模块是一种高效的(本机假设)实现。恕我直言,调用本机实现应该比调用python函数更快。

您可以尝试使用-O-OOcompile python核心调用解释器并再次检查时间。