Python内部函数是否已编译?

Python内部函数是否已编译?,第1张

Python内部函数是否已编译?

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

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的值。可以想象,这非常快,因为不需要解析,只需使用一些指向其他已经存在的对象的指针来填充快速结构。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5675005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存