6 votes

Quelles sont les meilleures pratiques et les meilleurs outils pour profiler et tester la performance du code python ?

Duplicata possible :
Comment profiler mon code ?

Quelles sont les meilleures pratiques et les meilleurs outils pour profiler et tester la performance du code python ? Des gains rapides ici ou des recommandations.

CProfile semble populaire et quelques excellentes notes/réponses ci-dessous, les deux sont de très bonnes réponses/tutoriels. Votez et je choisirai le meilleur dans un jour ou deux. Merci @senderle et @campos.ddc

Une fois qu'un problème a été détecté, existe-t-il des idiomes et/ou des astuces pour convertir le code afin de le rendre plus rapide ?

9voto

senderle Points 41607

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X