【问题标题】:Python inspect.stack is slowPython inspect.stack 很慢
【发布时间】:2013-06-28 17:31:55
【问题描述】:

我只是在分析我的 Python 程序,看看为什么它看起来相当慢。我发现它的大部分运行时间都花在了 inspect.stack() 方法上(用于输出带有模块和行号的调试消息),每次调用 0.005 秒。这似乎相当高; inspect.stack 真的这么慢吗,还是我的程序有问题?

【问题讨论】:

    标签: python introspection inspect


    【解决方案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()) 可以循环使用,但预计会比上述方法慢。

    【讨论】:

      猜你喜欢
      • 2019-08-25
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      相关资源
      最近更新 更多