J'utilise cProfile pour profiler mon code et cela fonctionne très bien. J'utilise également gprof2dot.py pour visualiser les résultats (le rend un peu plus clair).
Cependant, cProfile (et la plupart des autres profileurs Python que j'ai vus jusqu'à présent) semblent uniquement profiler au niveau de l'appel de fonction. Cela crée de la confusion lorsque certaines fonctions sont appelées à partir d'endroits différents - je n'ai aucune idée si l'appel n ° 1 ou l'appel n ° 2 prend la majorité du temps. Cela devient encore pire lorsque la fonction en question a six niveaux de profondeur, appelée depuis sept autres endroits.
Comment obtenir un profilage ligne par ligne?
Au lieu de cela:
function #12, total time: 2.0s
J'aimerais voir quelque chose comme ça:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfile montre combien de temps total "transfère" au parent, mais encore une fois cette connexion est perdue quand vous avez un tas de couches et d'appels interconnectés.
Idéalement, j'aimerais avoir une interface graphique qui analyserait les données, puis me montrerait mon fichier source avec un temps total donné à chaque ligne. Quelque chose comme ça:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
Ensuite, je serais capable de cliquer sur le deuxième appel "func (c)" pour voir ce qui prend du temps dans cet appel, indépendamment de l'appel "func (a)".
Cela a-t-il du sens? Existe-t-il une bibliothèque de profilage qui collecte ce type d'informations? Y a-t-il un outil génial que j'ai manqué?
pstats.print_callers
. Un exemple est ici .