【问题标题】:Get frame info for outer scope, but only invest the time in inner scope获取外部范围的帧信息,但只在内部范围内投入时间
【发布时间】:2020-11-16 10:59:38
【问题描述】:

我有以下场景,我想在我的范围之上获取范围的框架信息。

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 用于外部范围),以其他方式快速 - 这也很好。

【问题讨论】:

    标签: python higher-order-functions inspect


    【解决方案1】:

    没有办法将工作推迟到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 快几个数量级。

    【讨论】:

    猜你喜欢
    • 2016-06-23
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多