记录memory_profiler中的报告

时间:2014-06-10 13:13:00

标签: python profiler memory-profiling

我正在使用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进程需要花费很多时间,我想知道我是否可以以某种方式记录/存储此输出,并让脚本保持运行,可能是在晚上。

我的想法是在许多def函数中使用装饰器@profile,并将所有结果以某种方式存储在单个TXT或许多不同的TXT文件中,这不是重要的,重要的是如果可能的话。

3 个答案:

答案 0 :(得分:5)

来自评论:

如果你刚开始

run_my_thing > output.txt

在shell中,您可以将stdout存储在文件中。

这将完全绕过memory_profiler。显然,重新定位stdout并不理想,但如果它用于人工分析,则不应该是一个大问题。

答案 1 :(得分:3)

我没有尝试过,但似乎很简单 - 来自docs

  

报告

     

通过将IO流传递为,可以将输出重定向到日志文件   装饰器的参数,如@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')

答案 2 :(得分:0)

可以在其回购中找到将memory_profiler输出发送到日志文件的最佳示例:

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