**Ceci est une ancienne révision du document !** ----
======Python benchmark : accélérer ses calculs====== Tous les résultats sont indiqués en secondes. La fonction something() consiste généralement au choix d'un nombre flottant aléatoire : <Code python> from random import uniform def something(): return uniform(-100000,100000) </Code> Bien que ne semblant avoir indépendemment que peu d'effets, l'application de l'ensemble de ces astuces dans un programme peut avoir un effet drastique sur son temps d'exécution. ====Appel de fonction==== Appel dans une boucle : <Code python> def doit(): something() rng = range(x) for i in rng: doit() </Code> Boucle dans la fonction : <Code python> def doit(x): rng = range(x) for i in rng: something() doit(x) </Code> ===Bench=== 1.000.000 de tours : - Appel dans une boucle : 1.341 - Boucle dans la fonction : 1.164 <barchart>0|50x20|100|Dans:100,Hors:70</barchart> ===Conclusion=== L'appel à une fonction prends du temps, il est donc bien plus rapide de mettre la boucle à l'intérieur de la fonction. =====Dictionnaires, tableaux et listes====== ====Initialisation==== Dictionnaire : <Code python> for i in range(10000000): dict = {5:10,1:8,7:2} </Code> Tableau : <Code python> for i in range(10000000): array = [10,8,2] </Code> Liste : <Code python> for i in range(10000000): list = (10,8,2) </Code> - Dictionnaire : 2.356 - Tableau : 2.309 - Liste : 0.639 <barchart>0|50x20|2.356|dict:2.356,array:2.309,list:0.639</barchart> ====Récupération d'une valeur==== Dictionnaire : <Code python> for i in range(10000000): dict[1] </Code> Tableau : <Code python> for i in range(10000000): array[1] </Code> Liste : <Code python> for i in range(10000000): list[1] </Code> - Dictionnaire : 0.795 - Tableau : 0.702 - Liste : 0.802 <barchart>0|50x20|0.802|dict:0.795,array:0.702,list:0.802</barchart> =====Imports===== ====From et import==== From : <Code python> rng = range(x) for i in rng: from math import * something() </Code> <note important>Cette syntaxe (//import *//) n'est correcte qu'au premier niveau du programme. J'ai ici passé outre les alertes afin d'en calculer la vitesse.</note> From limité : <Code python> rng = range(x) for i in rng: from math import pi something() </Code> Import : <Code python> rng = range(x) for i in rng: import math something() </Code> ===Bench=== 1.000.000 de tours : - From : 12.56 - From limité : 2.99 - Import : 0.99 <barchart>0|50x20|13|From:12.56,From2:2.99,Import:0.99</barchart> ===Conclusion=== En cas de besoin ou de volonté d'utiliser la syntaxe //from//, l'import d'éléments précis dans le module s'avère cinq à six fois plus véloce que l'import complet dudit module. L'utilisation de la syntaxe //import// seule reste quand à elle de 12 à 13 fois plus efficiente. ====Réimporter==== Import multiple : <Code python> rng = range(x) for i in rng: import math something() </Code> Import unique : <Code python> import math rng = range(x) for i in rng: something() </Code> ===Bench=== 1.000.000 de tours : - Import multiple : 9.95 - Import unique : 0.79 <barchart>0|50x20|10|Multiple:9.95,Unique:0.79</barchart> ===Conclusion=== Un import peut-être très long (cela dépend de la taille du module), il faut donc toujours éviter d'importer plusieurs fois la même chose, en faisant par exemple : <Code python> math = None rng = range(x) for i in rng: if math is None: import math something() </Code> =====Opérateurs===== ====Division et multiplication==== Division : <Code python> rng = range(x) for i in rng: 123456.789 / 4 </Code> Multiplication : <Code python> rng = range(x) for i in rng: 123456.789 * 0.25 </Code> Le résultat de ces calculs est le même. ===Bench=== Calcul effectué 1.000.000 de fois : - Division : 0.121 - Multiplication : 0.047 <barchart>0|50x20|12.1|Division:12.1,Multiplication:4.7</barchart> ===Conclusion=== La multiplication est de deux à quatre fois plus rapide que la division. ====Incrémentation et addition==== Addition : <Code python> rng = range(x) for i in rng: i = i + 1 </Code> Incrémentation : <Code python> rng = range(x) for i in rng: i += 1 </Code> ===Bench=== Calcul effectué 1.000.000 de fois : - Addition : 0.140 - Incrémentation : 0.117 <barchart>0|50x20|14|Addition:14,Incrémentation:11.7</barchart> ===Conclusion=== L'incrémentation est légèrement plus rapide que l'addition. =====Classes==== ====Accès aux méthodes==== Point dans la boucle : <Code python> arr = [] rng = range(x) for i in rng: arr.append(something()) </Code> Point hors de la boucle : <Code python> arr = [] append = arr.append rng = range(x) for i in rng: append(something()) </Code> ===Bench=== Calcul effectué 1.000.000 de fois : - Point dans la boucle : 1.307 - Point hors de la boucle : 1.157 <barchart>0|50x20|1.3|Dans:1.3,Hors:1.1</barchart> ===Conclusion=== La référence à une méthode de classe (syntaxe du point), au lieu d'être recalculée à chaque tour de boucle, peut être une fois pour toutes stockée dans une variable, accélérant notablement les calculs. =====WIP===== En cours d'écriture. A venir : benchmark code, parcourt et tri de tableaux/listes et dictionnaires, concaténation et vitesse des opérateurs mathématiques et de comparaison.