python:benchmark:loops

====== Boucles ====== Dans le monde des boucles, ''while'' a souvent les ors de la vitesse. C'était sans compter Python. {{page>info}} Pour voir la vitesse que met une boucle à se lancer, on choisit d'abord des petites boucles à dix tours, que l'on lance cent mille fois. <Code python> python -m timeit -n 1 -r 100000 -s "i=0" "while i<10: i+=1" 1 loops, best of 100000: 0.585 usec per loop python -m timeit -n 1 -r 100000 -s "for i in range(10): pass" 1 loops, best of 100000: 0.585 usec per loop python -m timeit -n 1 -r 100000 -s "r=range(10)" "for i in r: pass" 1 loops, best of 100000: 0.292 usec per loop </Code> <gchart 270x130 hbar center "Boucles à 10 tours"> while = 585 for = 585 for préparée = 292 </gchart> Les boucles while et for vont exactement à la même vitesse sauf si, surprise, on extraie la fonction ''range()'' de la boucle for, qui va tout à coup deux fois plus vite. <WRAP center tip> La boucle while est handicapée par l'opération sur un compteur, qui est **interprétée** par python à chaque tour. La fonction ''range()'' est implémentée directement en C dans l'interpréteur et va donc beaucoup plus vite, à moins que l'on prenne la peine de ne pas l'appeller à chaque tour. </WRAP> Pour comparer leurs vitesse de fonctionnement on fait tourner les boucles dix millions de fois. <Code python> python -m timeit -n 1 -r 10 -s "i=0" "while i<10000000: i+=1" 1 loops, best of 10: 687 msec per loop python -m timeit -n 1 -r 10 -s "r=range(10000000)" "for i in r: pass" 1 loops, best of 10: 214 msec per loop python -m timeit -n 1 -r 10 -s "for i in range(10000000): pass" 1 loops, best of 10: 1.2 usec per loop </Code> <gchart 270x130 hbar center "Boucles à 10.000.000 tours"> while = 687000 for préparée = 214000 for = 1.2 </gchart> La boucle for avec la fonction ''range()'' préparée confirme le résultat précédent et creuse l'écart, en allant trois fois plus vite que la boucle while. Très étonnement, la boucle for traditionnelle retourne des résultats un million de fois plus rapides. <WRAP center tip> Python optimise drastiquement la forme habituelle à la compilation ? </WRAP>