Somando com um loop for mais rápido que com reduzir?

Eu queria ver o quanto a redução era mais rápida do que usar um loop for para operações numéricas simples. Aqui está o que eu encontrei (usando a biblioteca timeit padrão):

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

Olhando um pouco mais:

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

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

Oque esta acontecendo aqui? Obviamente, reduzir faz um loop mais rápido do que para, mas a chamada de função parece dominar. A versão reduzida não deve ser executada quase inteiramente em C? O uso de iadd (c, i) na versão do loop for faz com que seja executado em ~ 24 segundos. Por que usar operator.add seria muito mais lento que +? Eu estava com a impressão + e operator.add executou o mesmo código C (verifiquei para ter certeza de que operator.add não estava apenas chamando + em python ou algo assim

BTW, apenas usando execuções de soma em ~ 2,3 segundo

In [70]: print(sys.version)
2.7.1 (r271:86882M, Nov 30 2010, 09:39:13) 
[GCC 4.0.1 (Apple Inc. build 5494)]

questionAnswers(3)

yourAnswerToTheQuestion