Python.stack速度很慢

Python.stack速度很慢,python,introspection,inspect,Python,Introspection,Inspect,我只是在分析我的Python程序,看看为什么它看起来相当慢。我发现它的大部分运行时间都花在inspect.stack()方法上(用于输出带有模块和行号的调试消息),每次调用0.005秒。这似乎相当高;inspect.stack真的这么慢,还是我的程序有问题?inspect.stack()做两件事: 通过向调用者询问堆栈帧的解释器(sys.\u getframe(1)),然后按照所有.f\u返回引用收集堆栈。这个很便宜 每帧收集文件名、行号和源文件上下文(源文件行加上一些额外的行,如果需要)。后

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

inspect.stack()
做两件事:

  • 通过向调用者询问堆栈帧的解释器(
    sys.\u getframe(1)
    ),然后按照所有
    .f\u返回
    引用收集堆栈。这个很便宜

  • 每帧收集文件名、行号和源文件上下文(源文件行加上一些额外的行,如果需要)。后者需要读取每个堆栈帧的源文件。这是一个昂贵的步骤

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

inspect.stack(0)
即使将上下文设置为0,由于文件名被确定并验证为存在于每个帧中,您仍然需要对每个帧进行一些文件系统访问。

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
请注意,最后一个
帧.f_back
None
,循环将结束

sys.\u getframe(1)
显然不应该使用,因为它是一个内部方法


作为替代方案,
inspect.getouterframes(inspect.currentframe())
可以循环,但这比上述方法要慢。

这将inspect.stack方法中花费的时间减少了大约5倍。从这里开始,我想我将努力减少记录的调试消息的数量(或将它们合并)。谢谢你的信息。