Je voulais voir à quel point la réduction était plus rapide que d'utiliser une boucle for pour des opérations numériques simples. Voici ce que je trouve (en utilisant la bibliothèque standard timeit):Sommer avec une boucle for plus vite qu'avec réduire?
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
Vous cherchez un peu plus:
In [68]: timeit("1+2", setup)
Out[68]: 0.04145693778991699
In [69]: timeit("add(1,2)", setup)
Out[69]: 0.22807812690734863
Qu'est-ce qui se passe ici? Évidemment, réduire boucle plus vite que pour, mais l'appel de fonction semble dominer. La version réduite ne devrait-elle pas fonctionner presque entièrement en C? L'utilisation de iadd (c, i) dans la version de la boucle for le fait fonctionner en ~ 24 secondes. Pourquoi utiliser operator.add serait tellement plus lent que +? J'étais sous l'impression + et operator.add exécutait le même code C (j'ai vérifié pour m'assurer que operator.add n'appelait pas seulement + dans python ou quoi que ce soit).
BTW, juste en utilisant la somme s'exécute en ~ 2,3 secondes.
In [70]: print(sys.version)
2.7.1 (r271:86882M, Nov 30 2010, 09:39:13)
[GCC 4.0.1 (Apple Inc. build 5494)]
Le fait que l'utilisation 'sum' fait le travail 4 fois plus rapide est à peu près un indicateur que « il devrait y avoir une façon évidente de le faire ». – jsbueno
@jsbbueno: C'est vrai, mais je faisais ça pour trouver le moyen le plus rapide de faire des calculs numériques généraux sur des séquences. Dans le monde réel, j'utiliserais certainement la somme pour additionner: D N'a pas essayé mul, mais je suis sûr que les résultats seraient similaires. –