9

I was just profiling my Python program to see why it seemed to be rather slow. I discovered that the majority of its running time was spent in the inspect.stack() method (for outputting debug messages with modules and line numbers), at 0.005 seconds per call. This seems rather high; is inspect.stack really this slow, or could something be wrong with my program?

4

2 回答 2

20

inspect.stack()做两件事:

  • 通过向解释器询问调用者 ( ) 的堆栈帧,sys._getframe(1)然后跟踪所有.f_back引用来收集堆栈。这很便宜。

  • 每帧,收集文件名、行号和源文件上下文(如果需要,源文件行加上一些额外的行)。后者需要读取每个堆栈帧的源文件。这是昂贵的一步

要关闭文件上下文加载,请将context参数设置为0

inspect.stack(0)

即使上下文设置为 0,您仍然会在每帧中产生一些文件系统访问,因为文件名已确定并验证是否存在于每个帧中。

于 2013-07-01T14:45:41.143 回答
17

inspect.stack(0)可以比 快inspect.stack()。即便如此,完全避免调用它是最快的,也许使用这样的模式来代替:

frame = inspect.currentframe()
while frame:
    if has_what_i_want(frame):  # customize
        return what_i_want(frame)  # customize
    frame = frame.f_back

请注意,最后一个frame.f_back None,然后循环将结束。

sys._getframe(1)显然不应该使用,因为它是一种内部方法。

作为替代方案,inspect.getouterframes(inspect.currentframe())可以循环,但预计这会比上述方法慢。

于 2017-03-06T21:50:24.870 回答