Python inspect.stack很慢

dpi*_*h40 7 python introspection inspect

我只是在分析我的Python程序,看看为什么它看起来很慢.我发现它的大部分运行时间花费在inspect.stack()方法上(用于输出带模块和行号的调试消息),每次调用0.005秒.这似乎相当高; 是inspect.stack真的这种缓慢的,或可能的东西是错误与我的计划?

Mar*_*ers 12

inspect.stack() 做两件事:

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

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

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

inspect.stack(0)
Run Code Online (Sandbox Code Playgroud)

即使背景设置为0,你仍然招致每帧的一些文件系统访问作为文件名被确定和验证的每一帧存在.


Acu*_*nus 10

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
Run Code Online (Sandbox Code Playgroud)

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

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

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