当前位置: 首页 > 知识库问答 >
问题:

为什么CPython预分配一些整数?

强保臣
2023-03-14

这里的CPython文档中指出:

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

这使得这个比较是正确的:

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

我想知道这背后的原因是什么,为什么有些号码是预先分配的,为什么特别是那些号码?

共有1个答案

林烨华
2023-03-14

因为CPython的实现人员已经决定,由于性能的原因,这是一个预分配的好范围,因为它涵盖了最常用的整数值。[-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).
*/
 类似资料:
  • 问题内容: 这是一篇受此评论启发的帖子,内容涉及如何在CPython中为对象分配内存。最初,这是在创建列表并将其添加到for循环中_以_ 实现列表理解的上下文中。 所以这是我的问题: CPython中有多少个不同的分配器? 每个功能是什么? 什么时候被正式称为?(根据此评论中的内容,列表理解可能不会导致调用, python在启动时会为其分配多少内存? 是否有规则来控制哪些数据结构在此存储器上首先获

  • 但如果将浮点数或整数减小或增大一定量,则比较运行得快得多: 更改比较运算符(例如,改用或)不会以任何明显的方式影响时间。 这不仅仅与幅度有关,因为选择较大或较小的值会导致更快的比较,所以我怀疑这是由于位排列的某种不幸方式造成的。

  • 为什么在堆上分配内存,而没有? 它们之间的主要区别是可以重用,而std::latch不能重用,但我找不到解释为什么前者会分配内存。

  • 本文向大家介绍Cython和CPython有什么区别?,包括了Cython和CPython有什么区别?的使用技巧和注意事项,需要的朋友参考一下 CPython是C语言中称为“ Python”的语言的实现。不仅是Cpython,还实现了诸如IronPython和Jython(用Java实现的Python)之类的更多语言。 Python是一种解释型编程语言。因此,Python程序员需要解释器将Pyth

  • 我们在日志中看到了OutOfMemoryExceptions,它们似乎与java堆提交大小从~1G增长到~2.4G一致。尽管有错误消息,但堆空间似乎没有用完。除了抛出异常(和生成的堆转储)之外,调整大小似乎最终会成功,应用程序继续运行,没有任何问题(堆提交大小约2.4G)。 下面是日志输出的一个示例: 请注意,在OOME之前,提交的堆总数在1GB和2.4GB之间振荡。我们可以看到,它之前非常稳定在

  • 若一条代码不能向量化,你可以通过预分配任何输出结果已保存其中的向量或数组以加快for 循环。例如,这个代码用zeros函数把for循环产生的向量预分配。这使得for循环的执行显著加快。 r = zeros(32,1); for n = 1:32 r(n) = rank(magic(n)); end 上例中若没有使用预分配,MATLAB的注释器利用每次循环扩大r向量。向量预分配排除了该步骤