cProfile
est l'outil de profilage classique. La façon la plus simple de l'utiliser est la suivante ainsi :
python -m cProfile myscript.py
Ici, je l'ai appelé sur la routine de test d'une implémentation de référence de la fonction twister de mersenne que j'ai écrit.
me@mine $ python -m cProfile mersenne.twister.py
True
True
1000000
1003236 function calls in 2.163 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 2.163 2.163 <string>:1(<module>)
1 0.001 0.001 2.162 2.162 mersenne.twister.py:1(<module>)
3 0.001 0.000 0.001 0.000 mersenne.twister.py:10(init_gen)
1000014 1.039 0.000 1.821 0.000 mersenne.twister.py:19(extract_number)
1 0.000 0.000 0.000 0.000 mersenne.twister.py:3(Twister)
1603 0.766 0.000 0.782 0.000 mersenne.twister.py:33(generate_numbers)
1 0.000 0.000 0.000 0.000 mersenne.twister.py:4(__init__)
1 0.317 0.317 2.161 2.161 mersenne.twister.py:42(_test)
1 0.001 0.001 2.163 2.163 {execfile}
1 0.000 0.000 0.000 0.000 {len}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1608 0.038 0.000 0.038 0.000 {range}
ncalls
est le nombre de fois qu'une fonction a été appelée. tottime
est le temps total passé dans une fonction, à l'exclusion le temps passé dans les appels de sous-fonctions. percall
es tottime / ncalls
. cumtime
est le temps passé dans la fonction y compris le temps passé dans les appels de sous-fonctions. Les données restantes sont les suivantes : filename:lineno(func_name)
.
Dans la plupart des cas, il s'agit de ncalls
y tottime
d'abord. Dans les données ci-dessus, vous pouvez voir que la grande majorité du temps passé par ce programme se déroule en extract_number
. En outre, nous pouvons constater que extract_number
est appelé nombreux (1000014) fois. Donc, tout ce que je peux faire pour accélérer extract_number
accélérera considérablement l'exécution de ce code de test. Si cela me permet de gagner un microseconde Le gain est alors multiplié par 1000014, ce qui donne un gain d'une seconde entière.
Je devrais alors travailler sur generate_numbers
. Les gains ne seront pas aussi importants, mais ils peuvent tout de même être significatifs, et comme cette fonction prend 0,7 seconde de plus, il y a des avantages à en tirer.
Cela devrait vous donner une idée générale. Notez cependant que le tottime
Le nombre peut parfois être trompeur, dans les cas de récurrence, par exemple.