165 votes

Comment puis-je profiler le code python ligne par ligne?

J'ai été en utilisant cProfile pour le profil de mon code, et ça a été génial de travailler. J'utilise aussi gprof2dot.py pour visualiser les résultats (en fait un peu plus clair).

Cependant, cProfile (et la plupart des autres python profileurs j'ai vu jusqu'à présent) semblent uniquement de profil à la fonction-niveau d'appel. Cela provoque de la confusion lorsque certaines fonctions sont appelées à partir de différents endroits - je n'ai aucune idée si l'appel #1 ou composez le #2 est de prendre la majorité du temps. Cela devient encore pire lorsque la fonction en question est de 6 niveaux de profondeur, appelé à partir de 7 autres endroits.

Donc ma question est: comment puis-je obtenir une ligne-par-ligne de profilage? Au lieu de cela:

function #12, total time: 2.0s

J'aimerais voir quelque chose comme ceci:

function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s

cProfile ne montrent comment une grande partie de la durée totale des "transferts" de la mère, mais encore une fois cette connexion est perdue lorsque vous avez un tas de couches et interconnecté d'appels.

Idéalement, j'aimerais avoir une interface graphique, qui permettrait d'analyser les données, puis montrez-moi mon fichier source avec un temps total de donné à chaque ligne. Quelque chose comme ceci:

main.py:

a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s

Puis je serais en mesure de cliquer sur le deuxième "func(c)" appeler pour voir ce qui prend du temps que dans l'appel, distincte de la "func ()" appel.

Cela fait-il sens? Est-il un profilage de la bibliothèque qui recueille ce type d'info? Est-il un outil génial que j'ai manqué? Tout commentaire est apprécié. Merci!!

144voto

Joe Kington Points 68089

Je crois que c'est à cela que line_profiler de Robert Kern est destiné. Du lien:

 File: pystone.py
Function: Proc2 at line 149
Total time: 0.606656 s

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
   149                                           @profile
   150                                           def Proc2(IntParIO):
   151     50000        82003      1.6     13.5      IntLoc = IntParIO + 10
   152     50000        63162      1.3     10.4      while 1:
   153     50000        69065      1.4     11.4          if Char1Glob == 'A':
   154     50000        66354      1.3     10.9              IntLoc = IntLoc - 1
   155     50000        67263      1.3     11.1              IntParIO = IntLoc - IntGlob
   156     50000        65494      1.3     10.8              EnumLoc = Ident1
   157     50000        68001      1.4     11.2          if EnumLoc == Ident1:
   158     50000        63739      1.3     10.5              break
   159     50000        61575      1.2     10.1      return IntParIO
 

J'espère que cela pourra aider!

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