当前位置: 首页 > 面试题库 >

Python内部函数是否已编译?

晏阳飙
2023-03-14
问题内容

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


问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 有没有一种好的方法来检查对象o是否是内置的Python函数? 我知道我可以使用,例如 因为type(pow)是’builtin_function_or_method’。 但是有更好的方法吗? 问题答案: 类型模块: 不过,如果您仔细观察,就会发现它与您现在所做的没有什么不同。 因此,根据您的情况使用

  • 问题内容: 我正在用Python编程,我想知道是否可以测试代码中是否已调用函数 我该怎么做? 问题答案: 如果该函数知道其自己的名称是可以的,则可以使用function属性: 您还可以使用装饰器设置属性:

  • 严格说来,Ruby中没有函数.但Kernel模块中定义的方法(可以在任何地方用做函数,因此)可被其他语言当做函数来调用.若您对这些方法进行再定义时,就必需考虑到对其他方面的影响. `str 把字符串str当做外部命令来运行,并以字符串方式返回命令的输出.使用`str`形式来调用该方法(还可以使用%x(...)表示法进行调用.请参考命令输出). 可以使用$?来了解命令的结束状态. 若您只想执行命令,

  • 问题内容: 假设我有一个Python函数和。旨在以递归方式调用自身。不应递归调用。有没有办法确定是否已递归调用它? 问题答案: 为此使用追溯模块: 因此,如果堆栈中的任何条目指示从调用了代码,则该调用是(间接)递归的。该方法使您可以轻松访问此数据。下面的示例中的语句仅计算函数名称的完全匹配数。为了使它更漂亮(感谢agf的想法),您可以将其变成装饰器:

  • 基本上,我想写这样的代码: 这是不可能的,因为没有重载 因此,我目前正在使用,但它并不完美。 有没有一种方法可以不重新声明函数就知道函数是否存在? 基本上,我想做一些类似的事情 和主要的:

  • 问题内容: 我有一个由基本数学函数(abs,cosh,sinh,exp,…)组合定义的函数。 我不知道是否有差别(速度)来使用,例如, 而不是? 问题答案: 计时结果如下: 比它还处理Numpy数组要慢:它包含提供这种灵活性的其他代码。 但是,Numpy在数组 上的 速度很快: (PS:在python 2.7中比慢于慢,后者快约30%,但仍然比NumPy慢得多。) 因此,对于1000个元素而言,花

  • 通过前面的学习我们知道, Python 函数内部可以定义变量,这样就产生了局部变量,有读者可能会问,Python 函数内部能定义函数吗?答案是肯定的。Python 支持在函数内部定义函数,此类函数又称为 局部函数。 那么,局部函数有哪些特征,在使用时需要注意什么呢?接下来就给读者详细介绍 Python 局部函数的用法。 首先,和局部变量一样,默认情况下局部函数只能在其所在函数的作用域内使用。举个例