записать отчет из memory_profiler

Я профилирую свой код с помощью memory_profiler

from memory_profiler import profile

@profile
def whatever():
    ....
    ....

Итак, как многие из вас могут знать, я получаю вывод на экран, подобный этому:

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a

Мой вопрос:

Поскольку процесс @profile занимает много времени, мне было интересно, могу ли я каким-то образом зарегистрировать/сохранить этот вывод и оставить скрипт работающим, возможно, на ночь.

Моя идея состоит в том, чтобы использовать декоратор @profile во многих функциях определения и хранить все результаты каким-то образом в одном файле TXT или во многих разных файлах TXT, это не важно, важно, будет ли это возможно.


person codeKiller    schedule 10.06.2014    source источник
comment
Вы можете использовать модуль ведения журнала Python.   -  person Kobi K    schedule 10.06.2014
comment
Вы не можете просто передать результат? Это быстрое и грязное решение.   -  person Veedrac    schedule 10.06.2014
comment
@Veedrac, извините, я не слежу за вами, я не очень разбираюсь в memory_profiler, я просто знаю, как заставить его работать, но я еще даже не знаю, откуда берется вывод. Это помогло бы, я думаю.   -  person codeKiller    schedule 10.06.2014
comment
Просто run_my_thing > output.txt в оболочке. Полностью обойти memory_profiler. Очевидно, что это не идеально.   -  person Veedrac    schedule 10.06.2014
comment
Спасибо, Veedrac, мне на самом деле все равно, насколько идеальным он может быть, если он работает, то мне этого будет достаточно, так что спасибо.   -  person codeKiller    schedule 10.06.2014


Ответы (3)


Из комментариев:

Если вы просто бежите

run_my_thing > output.txt

в оболочке вы можете хранить stdout в файле.

Это полностью обойдет memory_profiler. Очевидно, что просто перенаправлять stdout не идеально, но если это нужно для человеческого анализа, это не должно быть серьезной проблемой.

person Veedrac    schedule 10.06.2014

Я не пробовал, но кажется довольно простым. Из документов:

СОСТАВЛЕНИЕ ОТЧЕТОВ

Вывод можно перенаправить в файл журнала, передав поток ввода-вывода в качестве параметра декоратору, например @profile(stream=fp) .

>>> fp=open('memory_profiler.log','w+')
>>> @profile(stream=fp)
>>> def my_func():
    ...     a = [1] * (10 ** 6)
    ...     b = [2] * (2 * 10 ** 7)
    ...     del b
    ...     return a

Для многих файлов txt/log, т.е. сохранения результатов для различных функций/блоков кода отдельно, передайте другой файловый объект при оформлении функции:

fp=open('memory_profiler.log','w+')
@profile(stream=fp)
def func1():
    # statements

fp2=open('memory_profiler2.log', 'w+')
@profile(stream=fp2)
def func2():
    # statements
.....

Минус: много открытых соединений.


Элегантный способ входа в несколько файлов — использовать RotatingFileHandler:

Иногда было бы очень удобно использовать модуль логгера, особенно когда нам нужно использовать RotatingFileHandler. Вывод можно перенаправить в модуль регистратора, просто используя LogFile модуля профилировщика памяти.

.

from memory_profiler import LogFile
import sys

sys.stdout = LogFile('memory_profile_log')
person Nabeel Ahmed    schedule 25.11.2015

Лучший пример отправки выходных данных memory_profiler в файл журнала можно найти в его репо:

https://github.com/pythonprofilers/memory_profiler/blob/master/examples/reporting_logger.py

person Shraddha Agrawal    schedule 19.08.2020