解释器维护的整数缓存是怎么回事?
Python 在将相同的文字编译成相同的代码对象时会对其进行优化,从而生成对象具有相同的身份。通常,[-5, 256] 范围内的整数会被缓存,但这并不能保证该范围内的所有整数都具有相同的标识。
在您提供的示例代码中,当您执行每一行时在 Python shell 中分别进行:
>>> a = 1 >>> b = 1 >>> a is b True
每行代码都是单独解析和编译的。但是,当您在文件中一起运行相同的代码时:
>>> a = 257; b = 257; a is b True
编译器可以优化文字。在编译过程中,AST 被转换为字节码,编译器会分析文字的用法以避免重复。这会在编译的代码中生成整数 257 的单个常量。
这种优化不仅限于整数,还适用于其他文字,例如浮点数。但是,它不适用于元组等更复杂的文字,其中元组内的文字是单独优化的。
您观察到创建两个 PyInt_Object 的原因可能是由于解析器将文字转换为整数的方法。解析器使用一个函数将文字转换为整数值,然后调用 PyLong_FromString 创建整数对象。这种方法避免了重写转换代码,并且可以轻松扩展。
但是,确保相等常量使用相同对象的最终优化发生在字节码编译期间,而不是 AST 转换期间。具体来说,compiler_add_o 函数负责将常量存储在字典对象中,从而导致相同的常量落入同一个槽中,并在最终字节码中由单个常量表示。
以上是为什么 Python 缓存一些整数而不缓存其他整数?的详细内容。更多信息请关注PHP中文网其他相关文章!