获取外部范围的帧信息,但仅将时间投入内部范围
Get frame info for outer scope, but only invest the time in inner scope
我有以下场景,我想获取范围上方范围的帧信息。
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
和 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
快几个数量级。
我有以下场景,我想获取范围上方范围的帧信息。
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
和 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
快几个数量级。