首页 > 解决方案 > 为什么 CPython 会预先分配一些整数?

问题描述

此处的 CPython 文档中,声明:

当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int 时,您实际上只是取回了对现有对象的引用。

这使得这个比较成立:

>>> a = -3
>>> b = -3
>>> a is b
True

我想知道这背后的原因是什么,为什么要预先分配一些数字以及为什么特别是这些数字?

标签: pythonperformancecachingallocationcpython

解决方案


因为 CPython 的实现者已经决定,出于性能原因,这是一个很好的预分配范围,因为它涵盖了最常用的整数值。range 没有什么神奇之处[-5,256]。少数负数可能包含在常见错误代码和列表负索引的范围内,并且上限只是设置为 2 的整数幂。

来自CPython 源代码的评论:

/* Small integers are preallocated in this array so that they
   can be shared.
   The integers that are preallocated are those in the range
   -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
*/

推荐阅读