首页 >后端开发 >Python教程 >为什么 Python 缓存一些整数而不缓存其他整数?

为什么 Python 缓存一些整数而不缓存其他整数?

Patricia Arquette
Patricia Arquette原创
2024-12-25 17:22:09611浏览

Why Does Python Cache Some Integers But Not Others?

解释器维护的整数缓存是怎么回事?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn