Quería ver cuánto más rápido se reduce que usar un bucle for para operaciones numéricas simples. Esto es lo que he encontrado (usando la biblioteca timeit estándar):¿Sumar con un bucle for más rápido que con reducir?
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
Mirando un poco más:
In [68]: timeit("1+2", setup)
Out[68]: 0.04145693778991699
In [69]: timeit("add(1,2)", setup)
Out[69]: 0.22807812690734863
¿Qué está pasando aquí? Obviamente, reducir does loop más rápido que para, pero la llamada a la función parece dominar. ¿No debería la versión reducida funcionar casi por completo en C? Usar iadd (c, i) en la versión for loop lo hace funcionar en ~ 24 segundos. ¿Por qué usar operator.add sería mucho más lento que +? Tenía la impresión de que + operator.add ejecutaba el mismo código C (lo comprobé para asegurarme de que operator.add no estaba simplemente llamando a + en python ni nada).
Por cierto, solo con la suma de carreras en ~ 2.3 segundos.
In [70]: print(sys.version)
2.7.1 (r271:86882M, Nov 30 2010, 09:39:13)
[GCC 4.0.1 (Apple Inc. build 5494)]
El hecho de que el uso de 'sum' hace el trabajo 4 veces más rápido es más o menos un indicador de que "debe haber una manera obvia de hacerlo". – jsbueno
@jsbbueno: Cierto, pero estaba haciendo esto para descubrir la manera más rápida de hacer cálculos numéricos generales sobre secuencias. En el mundo real, ciertamente usaría suma a suma: D No he probado mul, pero estoy seguro de que los resultados serían similares. –