Я действительно смущен скоростью вызовов функций в Python. Первый и второй случаи, ничего неожиданного:Скорость вызова функции Python
%timeit reduce(lambda res, x: res+x, range(1000))
10000 петель, лучшие из 3: 150 мкс на петле
def my_add(res, x):
return res + x
%timeit reduce(my_add, range(1000))
10000 петель, лучше всего из 3: 148 мкс на петле
Но третий случай выглядит странно для меня:
from operator import add
%timeit reduce(add, range(1000))
10000 петель, лучше всего 3: 80,1 мкс на петле
В то же время:
%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%?
Весь код Python скомпилирован в байт-код, '-O' просто отлаживает команды отладки, такие как блоки' assert' и 'if __debug__'. – kindall
Вы правы. Я был под ложным впечатлением, что -O будет делать то же самое, что и gcc. Это происходит в [pypy] (http://doc.pypy.org/en/latest/config/opt.html). Кроме того, [это] (http://stackoverflow.com/questions/4777113/what-does-python-optimization-o-or-pythonoptimize-do). –