CPython 3.11 通过位运算替代哈希取模、setdefault 字节码特化、Compact Dict 缓存优化三方面提升 dict 查询性能,无需改代码即可受益。

dict 查询变快,不是因为改了 API 或加了新方法,而是 CPython 解释器在底层悄悄做了三件事:哈希定位用位运算替代取模、特化字节码路径、Compact Dict 内存布局更缓存友好。你不用改代码,升级到 3.11 就能拿到收益。
哈希桶定位从 % 变成 &
老版本用 hash(key) % table_size 算下标,除法指令开销大、分支预测差;3.11 强制要求桶数组长度始终是 2 的幂,于是换成 hash(key) & (table_size - 1)——单条 CPU 指令搞定。
这要求扩容逻辑必须严格维持 2 的幂,解释器已内建拦截机制,哪怕你调用 dict.__resize__(不推荐),也会被重排。
影响场景:d[key]、key in d、d[key] = val 这类高频操作直接受益。
setdefault 字节码路径被合并优化
3.10 中 d.setdefault(k, v) 先查一次键是否存在,再决定是否赋值,重复哈希 + 探测;3.11 把它编译成一条紧凑路径,只算一次哈希、只探一次桶。
实测在循环中反复调用 d.setdefault(k, []) 构建嵌套结构时,比 3.10 快 18%~22%,尤其字典较大、冲突升高时更明显。
注意:if k not in d: d[k] = v 在极小字典里可能更快——因为避免了 setdefault 的函数调用开销。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
Compact Dict 布局提升缓存局部性
3.11 维持 Compact Dict 结构(自 3.7 起引入),但进一步优化了内存排布:键值对真正密集存储,稀疏索引表直接映射活跃槽位。
好处有二:
– CPU 预取更有效,连续访问的键值对大概率在同一个 cache line 里
– 查找时跳过的空槽更少,平均探测长度下降
别误把 for k in d: v = d[k] 当成高效写法——它比 for k, v in d.items() 多一次哈希和键比对,跟布局无关,纯属用法问题。
立即学习“Python免费学习笔记(深入)”;
容易被忽略的关键点
这些优化全部发生在解释器内部,对用户透明,但也带来几个隐性约束:
– 如果你用 C 扩展直接读写 PyDictObject 字段,需确认没硬编码取模逻辑
– sys.getsizeof(d) 返回值可能略低于 3.10,但这不代表真实内存占用变少
– 特化加速只在热点路径生效;短命进程(如 AWS Lambda 单次运行)或频繁 fork/exec 的场景,adaptive_state 来不及累积就退出,实际感受不到提升

















