获取外部范围的帧信息,但仅将时间投入内部范围

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.filenameframe.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 快几个数量级。