python对象池机制由cpython实现,缓存-5至256的小整数、特定字符串及空元组等不可变对象以提升性能;其非语言规范,不应用is比较普通值,仅适用于none/true/false等单例。

Python的对象池机制主要针对小整数和短字符串等常用对象进行缓存复用,目的是减少内存分配开销、提升运行效率。它不是用户可直接控制的全局缓存系统,而是CPython解释器在底层实现的优化策略,理解其原理有助于写出更高效、更符合直觉的代码。
小整数对象池:-5 到 256 是默认缓存范围
CPython会预先创建并复用范围在[-5, 256]内的整数对象。超出该范围的整数每次创建都是新对象(除非显式使用intern()或其它方式干预)。
- 验证方法:用is比较两个相同值的小整数,结果为True;对257及以上,通常为False
- 注意点:这个范围是CPython的实现细节,不属Python语言规范,其他解释器(如PyPy、Jython)可能不同
- 实际影响:在循环中频繁使用0~100的计数器时,不会反复创建新int对象,降低GC压力
字符串驻留(String Interning):自动与手动结合
Python会对某些字符串自动驻留(如标识符、常量字符串),使其共享同一内存地址;也可通过sys.intern()强制驻留。
- 自动驻留条件:仅含字母、数字、下划线的字符串字面量(如'hello'、'_123'),而'a b'、'x\n'通常不自动驻留
- 手动驻留适用场景:解析大量重复键名(如JSON字段名)、日志标签、枚举字符串等,可显著减少内存占用
- 风险提示:被驻留的字符串永不释放,滥用会导致内存泄漏,尤其在处理用户输入或动态生成字符串时需谨慎
其他内置类型缓存:浮点数、空元组等也有类似机制
除整数和字符串外,CPython还对部分不可变小对象做了轻量级复用:
立即学习“Python免费学习笔记(深入)”;
- 空元组()、空frozenset()全局唯一,多次使用返回同一对象
- 常见小浮点数(如0.0、1.0)也可能被缓存,但不如整数稳定,不建议依赖is判断
- None、True、False是单例,始终唯一,适合用is比较
对开发者的实用建议
对象池是隐式优化,不应作为逻辑依赖点,但可辅助性能调优:
- 比较布尔值、None时优先用is,语义清晰且略快
- 避免用is比较普通整数或字符串——应使用==,否则代码在边界值上可能偶然正确、实则脆弱
- 处理高频重复字符串(如协议字段、配置项)时,考虑主动intern(),配合dict或set使用效果更佳
- 性能敏感场景(如高频数值计算),尽量复用已知范围内的整数,避免触发额外对象创建










