Ale*_*nin 2 python optimization
我真的很困惑Python中的函数调用速度.第一和第二种情况,没有任何意外:
%timeit reduce(lambda res, x: res+x, range(1000))
Run Code Online (Sandbox Code Playgroud)
10000循环,最佳3:每循环150μs
def my_add(res, x):
return res + x
%timeit reduce(my_add, range(1000))
Run Code Online (Sandbox Code Playgroud)
10000循环,最佳3:每循环148μs
但第三种情况对我来说很奇怪:
from operator import add
%timeit reduce(add, range(1000))
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
那么,为什么第三种情况会加速约50%呢?
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>
Run Code Online (Sandbox Code Playgroud)
究其原因,一个直+更快的是,add仍然有叫Python的虚拟机的BINARY_ADD指令,以及由于它是一个函数执行一些其他工作,同时+是唯一一个BINARY_ADD指令.