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?
问问题
4148 次
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 回答