python - 为什么 CPython 会预先分配一些整数?
问题描述
从此处的 CPython 文档中,声明:
当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int 时,您实际上只是取回了对现有对象的引用。
这使得这个比较成立:
>>> a = -3
>>> b = -3
>>> a is b
True
我想知道这背后的原因是什么,为什么要预先分配一些数字以及为什么特别是这些数字?
解决方案
因为 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). */
推荐阅读
- javascript - 使用 JavaScript 下载二进制文件
- python-3.x - 从模型 Python 变量创建上下文
- jira - Jira 看板不显示卡片,但似乎存在问题
- accessibility - 有没有办法从自动化可访问性测试中排除 Web 应用程序的元素?或者是让它通过这些自动化测试的方法?
- python - 将 pandas 数据帧行转换为一对列表
- ruby-on-rails - 动作邮箱的后缀设置
- r - 使用 renderUI 时,在闪亮的情况下默认选择侧边栏选项卡
- acumatica - 无法在 Acumatica 2019R2 中验证/发布自定义项目
- postgresql - clojure/java.jdbc 和 postgres:Prepared statments 比字符串连接查询慢 100 倍?
- c# - 如何为 CD R 或 CD RV 磁盘获取可用空间?