Подтвердить что ты не робот

Профайлер Python по очереди?

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

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

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

4b9b3361

Ответ 1

Я бы использовал 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)

Ответ 2

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