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?

29
demandé sur Tim 2011-08-09 20:27:16

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)
13
répondu gurney alex 2011-08-14 16:03:39

Vous pourriez être intéressé par memory_profiler.

4
répondu gaborous 2012-11-12 21:19:13