python - 获取外部范围的帧信息,但只在内部范围内投入时间
问题描述
我有以下场景,我想在我的范围之上获取范围的框架信息。
def outer():
# This is really slow.
frames = inspect.stack()
def inner():
# I would like to "pay for it" here instead.
print(frames)
return inner
通话inspect.stack()
很慢,所以我只想在真正需要时才这样做,即有人打电话时inner
。但是如果我将它移动到内部函数中,我会得到与我需要的不同的帧。
或者,如果我能以其他方式快速获得所有的frame.filename
and frame.lineno
,(对于外部范围的每个),那也很好。frame
解决方案
没有办法将工作推迟到inner
通话之前,因为此时您想要的信息已不存在。如果您尝试将工作延迟到inner
,您将只能检索有关inner
调用时程序状态的信息,这将是与调用时完全不同的状态outer
。
也就是说,inspect.stack
速度很慢,你只关心文件名和行号信息。inspect.stack
正在做很多你不想要的工作。如果你想要的只是文件名和行号信息,你可以使用traceback.extract_stack
,这应该会快很多。
您可以通过手动提取所需信息来更快:
def do_it_manually():
frame = inspect.currentframe().f_back
results = []
while frame:
results.append((frame.f_code.co_filename, frame.f_lineno))
frame = frame.f_back
return results
这给出了一个(filename, lineno)
元组列表,从do_it_manually
的调用者开始。它比inspect.stack
我用深堆栈测试它快几个数量级。
推荐阅读
- c# - 一次使用多个键输入会在 Unity C# 中产生意外行为
- unity3d - Unity 场景和游戏选项卡被拉伸,碰撞器与视觉网格不同步
- jquery - 如何避免在使用 DataTable 制作的 pdf 中分隔表格行
- linux - 为什么受密码保护的根账户是 Amazon EC2 中的安全问题?
- python - 根据列条件替换列表
- java - 为什么这个 java 代码不运行类并打印值?我尝试了很多但无法找到出路
- java - 从另一个 Activity 更新 TextView
- java - 如何将对象(实体)存储在内存中,以便以后仅在使用 Hibernate 的工作应用程序中获取它?
- c++ - 可以清理损坏的堆吗?
- tensorflow - 获取卷积算法失败。这可能是因为 cuDNN 未能初始化