Python逐行内存分析器?

时间:2011-08-09 16:27:16

标签: python memory profiling

我希望从大型Python代码库中生成函数运行过程中堆使用或内存分配的摘要。

我熟悉heapy,并且在我的代码中的特定点上获取堆的“快照”对我很有用,但我发现很难生成“内存随时间变化” “总结一下。我也玩line_profiler,但这适用于运行时,而不是内存。

我现在的后备是Valgrind massif,但缺少Heapy和line_profiler提供的大量上下文Python信息。是否有后两种组合可以在Python程序的执行范围内提供内存使用感或堆增长感?

2 个答案:

答案 0 :(得分:13)

我会在程序启动时使用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)

答案 1 :(得分:5)

您可能会对memory_profiler感兴趣。