Python逐行内存分析器?

Python逐行内存分析器?,python,memory,profiling,Python,Memory,Profiling,我希望从一个大型Python代码库生成一个在函数运行过程中堆使用率或内存分配的摘要 我很熟悉,在代码中的特定点拍摄堆的“快照”对我很有帮助,但我发现很难用它生成“随时间变化的内存”摘要。我也玩过,但这是在运行时使用的,而不是内存 我现在的退路是Valgrind with,但它缺少Heapy和line_profiler提供的大量Python上下文信息。在Python程序的执行范围内,是否有后两者的某种组合可以提供内存使用或堆增长的感觉?我会在程序启动时使用它来注册自定义跟踪函数。每行代码都将调用自

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

我很熟悉,在代码中的特定点拍摄堆的“快照”对我很有帮助,但我发现很难用它生成“随时间变化的内存”摘要。我也玩过,但这是在运行时使用的,而不是内存

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

我会在程序启动时使用它来注册自定义跟踪函数。每行代码都将调用自定义的跟踪函数。然后,您可以使用该函数来存储由heapy收集的信息,或将其存储在文件中以供以后处理

下面是一个非常简单的示例,它每秒将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)
导入系统 导入时间 进口退欧 从guppy进口hpy _last_log_time=time.time() _logfile=open('logfile.txt','w') def heapy_配置文件(帧、事件、参数): currtime=time.time() 如果currtime-\u last\u log\u time<1: 返回 _上次日志时间=当前时间 代码=frame.f_代码 filename=code.co\u文件名 lineno=code.co\u 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_配置文件)
你可能会感兴趣。

如果你关心的是C世界中发生的事情,你能用它吗?C透视图就可以了,如果有一种方法可以定期自动运行gdb-有这样的方法吗?一个好问题,我想知道,所以我添加了一个悬赏。我还没有尝试过,但看起来我们可能会有一个赢家。(我会等到悬赏期结束后再奖励分数,以防其他人想试试这个问题)