Profileur de mémoire ligne par ligne Python?
Je cherche à générer, à partir d'une grande base de code Python, un résumé de l'utilisation du tas ou des allocations de mémoire au cours de l'exécution d'une fonction.
Je suis familier avec heapy , et cela m'a bien servi pour prendre des " instantanés "du tas à des points particuliers de mon code, mais j'ai eu du mal à générer un résumé" mémoire sur le temps". J'ai aussi joué avec line_profiler , mais cela fonctionne avec le temps d'exécution, pas avec la mémoire.
Mon repli en ce moment est Valgrind avec massif , mais il manque beaucoup d'informations contextuelles Python que Heapy et line_profiler donnent. Existe-t-il une sorte de combinaison des deux derniers qui donnent un sentiment d'utilisation de la mémoire ou de croissance du tas sur la durée d'exécution d'un programme Python?
2 réponses
Je voudrais utiliser sys.settrace
au démarrage du programme à enregistrer une coutume traceur de fonction. La fonction custom_trace_function sera appelée pour chaque ligne de code. Ensuite, vous pouvez utiliser cette fonction pour stocker des informations recueillies par heapy ou meliae dans un fichier pour un traitement ultérieur.
Voici un exemple très simple qui enregistre la sortie de hpy.heap () chaque seconde à un fichier texte brut:
import sys
import time
import atexit
from guppy import hpy
_last_log_time = time.time()
_logfile = open('logfile.txt', 'w')
def heapy_profile(frame, event, arg):
currtime = time.time()
if currtime - _last_log_time < 1:
return
_last_log_time = currtime
code = frame.f_code
filename = code.co_filename
lineno = code.co_firstlineno
idset = hpy().heap()
logfile.write('%s %s:%s\n%s\n\n' % (currtime, filename, lineno, idset))
logfile.flush()
atexit.register(_logfile.close)
sys.settrace(heapy_profile)