Python字典混合整数与字符串键时的键访问耗时差异问题
现象原因解释
这是CPython解释器内置的字典类型专属快速查找路径优化导致的现象,底层逻辑如下:
- 当字典所有键均为同一类型时,CPython会为其启用针对性优化的快速查找逻辑:
- 全字符串键的字典查找会跳过通用路径中冗余的类型分支判断、跨类型哈希兼容性校验步骤,直接走高度优化的字符串匹配流程,优化幅度极高
- 全整数键的字典也有对应快速路径,但整数本身的哈希值就是自身数值,相等性判断仅为简单的数值比较,固有开销极低,所以快速路径的优化幅度远小于字符串场景
- 只要对字典执行过一次非当前统一类型的键查找操作(无论该键是否存在,不需要实际插入该类型的键),CPython就会标记该字典的键类型不再单一,永久关闭快速查找路径,回退到兼容所有类型的通用查找流程,通用流程需要每次查找都执行完整的类型校验、哈希比对、相等性判定全步骤,开销高于快速路径
- 两者涨幅差异的核心原因:字符串场景下快速路径砍掉的开销占总耗时的比例很高,回退通用路径后新增开销的感知非常明显;而整数场景下快速路径本身优化幅度就小,回退带来的额外开销占比极低,所以耗时几乎没有可见变化
内容的提问来源于stack exchange,提问作者Riccardo Bucco
相关产品推荐
相关产品推荐

