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