Python内部函数是否已编译?
因此,在CPython中的AFAIK中,在解析时执行时,函数定义会编译为函数对象。但是内部函数呢?它们是在解析时被编译成函数对象,还是每次调用函数时都被编译(或解释)?内部函数是否会带来任何性能损失?
-
给出一般说明-假设您在模块中具有以下代码:
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的值。可以想象,这非常快,因为不需要解析,只需使用一些指向其他已经存在的对象的指针来填充快速结构。