Python字典是基于开放寻址法和动态哈希表实现的高效结构,平均时间复杂度O(1),依赖哈希函数、冲突处理与内存布局;键须不可变并实现__hash__和__eq__;采用扰动探测解决冲突;负载超2/3时扩容,删除不缩容但空槽过多时可能缩容。
Python字典(dict)不是简单的键值对容器,而是一个基于开放寻址法(open addressing)和动态哈希表(hash table)实现的高效数据结构。它的平均时间复杂度为 O(1) 的查找、插入和删除,核心依赖于哈希函数、冲突处理机制与内存布局设计。
当向字典插入一个键(key)时,Python 首先调用该对象的 __hash__() 方法获取一个整数哈希值(必须是不可变类型,否则抛出 TypeError)。这个哈希值会被映射到哈希表的一个具体槽位(bucket)上:
hash(key) & (table_size - 1)(前提是 table_size 是 2 的幂,便于位运算优化)%)运算开销,提升性能__hash__ 和 __eq__,否则可能引发逻辑错误或哈希冲突误判Python 不使用链地址法(如 Java HashMap 的拉链),而是采用开放寻址 + 伪随机探测(perturb-based probing)来解决哈希冲突:
j = ((5*j) + 1) + perturb,其中 perturb 初始为 hash >> 5,每次迭代右移 5 位字典在插入过程中持续监控负载因子(used / size)。一旦超过阈值(CPython 中为 2/3),就会触发扩容:
立即学习“Python免费学习笔记(深入)”;
fill / size ),后续插入可能触发缩容
sys.getsizeof(d) 查看当前内存占用,观察扩容前后变化理解底层有助于写出更高效的字典操作代码:
str, int, tuple)作键,它们的哈希计算快且稳定dict.fromkeys(keys, default) 或预分配(虽无直接 API,但可先批量插入占位)types.MappingProxyType 封装,获得不可变视图,减少意外修改开销hash(x) 和 id(x) 对比,注意字符串等小对象存在驻留(interning)影响哈希一致性