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é?
la source
pstats.print_callers
. Un exemple est ici .Réponses:
Je crois que c'est à cela que sert le line_profiler de Robert Kern . Depuis le lien:
J'espère que cela pourra aider!
la source
import line_profiler;
puis ?Vous pouvez également utiliser pprofile ( pypi ). Si vous souhaitez profiler l'ensemble de l'exécution, cela ne nécessite pas de modification du code source. Vous pouvez également profiler un sous-ensemble d'un programme plus vaste de deux manières:
basculer le profilage lorsque vous atteignez un point spécifique du code, tel que:
basculer le profilage de manière asynchrone à partir de la pile d'appels (nécessite un moyen de déclencher ce code dans l'application considérée, par exemple un gestionnaire de signal ou un thread de travail disponible) en utilisant le profilage statistique:
Le format de sortie des annotations de code ressemble beaucoup au profileur de ligne:
Notez que parce que pprofile ne repose pas sur la modification du code, il peut profiler les instructions de module de niveau supérieur, ce qui permet de profiler le temps de démarrage du programme (combien de temps il faut pour importer les modules, initialiser les globaux, ...).
Il peut générer une sortie au format cachegrind, vous pouvez donc utiliser kcachegrind pour parcourir facilement des résultats volumineux.
Divulgation: Je suis auteur de pprofile.
la source
Vous pouvez prendre l'aide du package line_profiler pour cela
1. Installez d'abord le package:
2. Utilisez la commande magique pour charger le package dans votre environnement python / notebook
3. Si vous souhaitez profiler les codes d'une fonction,
procédez comme suit:
vous obtiendrez une belle sortie formatée avec tous les détails si vous suivez ces étapes :)
la source
Juste pour améliorer l » Kington @ Joe réponse ci - dessus mentionnée .
Pour Python 3.x , utilisez line_profiler :
Installation:
Usage:
Supposons que vous ayez le programme
main.py
et en son sein, des fonctionsfun_a()
etfun_b()
que vous vouliez profiler par rapport au temps; vous devrez utiliser le décorateur@profile
juste avant les définitions de fonction. Par exemple,Le programme peut être profilé en exécutant la commande shell:
Les arguments peuvent être récupérés en utilisant
$ kernprof -h
Les résultats seront imprimés sur la console sous la forme:
EDIT: Les résultats des profileurs peuvent être analysés à l'aide du package TAMPPA . En l'utilisant, nous pouvons obtenir des graphiques souhaités ligne par ligne comme
la source
PyVmMonitor a une vue en direct qui peut vous y aider (vous pouvez vous connecter à un programme en cours d'exécution et en obtenir des statistiques).
Voir: http://www.pyvmmonitor.com/
la source