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千万条,速度很慢如何解决?

使用 NOT IN ( SELECT ... ) 时查询执行速度很慢

SQL中的delete语句很慢

通过装饰器实现获取当前执行的用例名称

python程序很慢

接口测试框架——第一篇