Python内部函数是否已编译?

发布于 2021-01-29 15:24:13

因此,在CPython中的AFAIK中,在解析时执行时,函数定义会编译为函数对象。但是内部函数呢?它们是在解析时被编译成函数对象,还是每次调用函数时都被编译(或解释)?内部函数是否会带来任何性能损失?

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    给出一般说明-假设您在模块中具有以下代码:

    def outer(x=1):
        def inner(y=2):
            return x+y
    

    当文件通过python通过python解析时compile(),上面的文本将转换为字节码以说明如何执行 模块
    。在模块字节码中,有两个“代码对象”,一个用于字节码,outer()一个用于字节码inner()。请注意,我说的是代码对象,而不是函数-
    代码对象包含的内容仅比函数使用的字节码少,并且包含在编译时可能知道的任何信息-例如outer()包含对的字节码的引用的字节码inner()

    当模块实际加载时,通过评估与模块关联的代码对象,会发生的事情是为创建了一个实际的“功能对象”
    outer(),并将其存储在模块的outer属性中。函数对象充当字节码和调用该函数所需的所有上下文相关的东西(例如,应从哪个全局指令中提取等)的集合,而这些在编译时是未知的。在某种程度上,代码对象是函数的模板,该函数是用于在填充所有变量的情况下执行实际字节码的模板。

    所有这些都inner()还不涉及-作为函数-每次您真正开始调用时outer(),即inner()为外部调用
    创建一个新的函数对象,该对象将已经创建的内部字节码对象绑定到全局列表,包括x传递给该外部调用的as的值。可以想象,这非常快,因为不需要解析,只需使用一些指向其他已经存在的对象的指针来填充快速结构。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看