Python inspect.stack 很慢
Posted
技术标签:
【中文标题】Python inspect.stack 很慢【英文标题】:Python inspect.stack is slow 【发布时间】:2013-06-28 17:31:55 【问题描述】:我只是在分析我的 Python 程序,看看为什么它看起来相当慢。我发现它的大部分运行时间都花在了 inspect.stack()
方法上(用于输出带有模块和行号的调试消息),每次调用 0.005 秒。这似乎相当高; inspect.stack
真的这么慢吗,还是我的程序有问题?
【问题讨论】:
【参考方案1】:inspect.stack()
做了两件事:
通过向解释器询问调用者 (sys._getframe(1)
) 的堆栈帧,然后跟踪所有 .f_back
引用来收集堆栈。这很便宜。
每帧,收集文件名、行号和源文件上下文(如果需要,源文件行加上一些额外的行)。后者需要读取每个堆栈帧的源文件。 这是昂贵的一步。
要关闭文件上下文加载,请将context
参数设置为0
:
inspect.stack(0)
即使 上下文设置为 0,您仍然会在每帧中产生一些文件系统访问,因为文件名被确定并验证每个帧都存在。
【讨论】:
这将花费在 inspect.stack 方法中的时间减少了大约 5 倍。从那里我想我会努力减少记录的调试消息的数量(或组合它们)。感谢您的信息。【参考方案2】: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())
可以循环使用,但预计会比上述方法慢。
【讨论】:
以上是关于Python inspect.stack 很慢的主要内容,如果未能解决你的问题,请参考以下文章
用python编程读取TXT时,数据大概有1千万条,速度很慢如何解决?