Строковый профилировщик памяти Python? - PullRequest
29 голосов
/ 09 августа 2011

Я хочу сгенерировать из большой кодовой базы Python сводную информацию об использовании кучи или распределении памяти за время выполнения функции.

Я знаком с heapy и он мне пригодился для того, чтобы делать «снимки» кучи в определенных точках моего кода, но мне было трудно сгенерировать сводку «со временем по памяти».Я также играл с line_profiler , но это работает со временем выполнения, а не с памятью.

Мой запасной вариант сейчас - Valgrind с массив , но ему не хватает многоконтекстной информации Python, которую предоставляют и Heapy, и line_profiler.Существует ли какая-то комбинация последних двух, которая дает ощущение использования памяти или увеличения кучи за период выполнения программы на Python?

Ответы [ 2 ]

13 голосов
/ 14 августа 2011

Я бы использовал sys.settrace при запуске программы для регистрации пользовательской функции трассировки.Функция custom_trace_function будет вызываться для каждой строки кода.Затем вы можете использовать эту функцию для хранения информации, собранной heapy или meliae , в файле для последующей обработки.

Вот очень простой пример, который каждую секунду записывает вывод hpy.heap () в простой текстовый файл:

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)
5 голосов
/ 13 ноября 2012

Вас может заинтересовать memory_profiler .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...