Суммирование с помощью цикла for быстрее, чем с помощью сокращения?

Я хотел увидеть, насколько сокращение было быстрее, чем использование цикла for для простых числовых операций. Вот что я обнаружил (используя стандартную библиотеку timeit):

In [54]: print(setup)
from operator import add, iadd
r = range(100)

In [55]: print(stmt1)    
c = 0
for i in r:
    c+=i        

In [56]: timeit(stmt1, setup)
Out[56]: 8.948904991149902
In [58]: print(stmt3)    
reduce(add, r)    

In [59]: timeit(stmt3, setup)
Out[59]: 13.316915035247803

Еще немного:

In [68]: timeit("1+2", setup)
Out[68]: 0.04145693778991699

In [69]: timeit("add(1,2)", setup)
Out[69]: 0.22807812690734863

Что здесь происходит? Очевидно, что reduce выполняет цикл быстрее, чем for, но, похоже, преобладает вызов функции. Разве сокращенная версия не должна работать почти полностью на C? Использование iadd (c, i) в версии цикла for заставляет его работать примерно за 24 секунды. Почему использование operator.add будет намного медленнее, чем +? У меня создалось впечатление, что + и operator.add запускают один и тот же код C (я проверил, что operator.add не просто вызывает + в python или что-то в этом роде).

Кстати, просто использование sum выполняется за ~ 2,3 секунды.

In [70]: print(sys.version)
2.7.1 (r271:86882M, Nov 30 2010, 09:39:13) 
[GCC 4.0.1 (Apple Inc. build 5494)]
8
задан Bryan Head 25 March 2011 в 18:20
поделиться