2013-11-18 3 views
2

Я действительно смущен скоростью вызовов функций в 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%?

ответ

7

add реализуется в С.

>>> 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 до сих пор назвать BINARY_ADD инструкции Питон VM как а также выполнить какую-то другую работу, поскольку она является функцией, а + - только a BINARY_ADD.

1

Модуль оператора экспортирует набор эффективных функций соответствующих собственных операторов Python. Например, оператор.add (x, y) эквивалентен выражению x + y. Названия функций - это те, которые используются для специальных методов класса; Варианты без ведущей и задней __ также предусмотрены для удобства.

От Python docs (курсив мой)

0

Модуль operator - это эффективная (я предполагаю) реализация. ИМХО, вызывающий собственную реализацию, должен быть быстрее вызова функции python.

Вы можете попробовать позвонить интерпретатору с помощью -O или -OO в compile ядро ​​python и снова проверить синхронизацию.

+1

Весь код Python скомпилирован в байт-код, '-O' просто отлаживает команды отладки, такие как блоки' assert' и 'if __debug__'. – kindall

+0

Вы правы. Я был под ложным впечатлением, что -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). –

Смежные вопросы