You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python集合内部负载因子探究:是否为2/3?代码是否有误?

Python集合的负载因子与扩容逻辑

你的测试代码没有问题,集合的负载因子并非和字典一样是2/3,CPython中集合的负载因子为7/8(0.875),扩容逻辑和字典存在明确差异。

核心差异说明

  • 字典的扩容阈值是桶数的2/3,当元素数量接近这个值时触发扩容,目的是平衡哈希冲突与内存占用。
  • 集合的扩容阈值是桶数的7/8,允许更高的填充率——因为集合仅存储键(无对应值),哈希冲突的影响相对更小,因此可以用更高的负载因子节省内存。

你的测试数据解析

从你提供的测试数据来看:

  • 集合在第5个元素时内存从216跃升至728,这并非是因为达到了7/8的负载因子,而是因为集合的初始内部缓冲区(用于存储元素和哈希值)在元素数量较小时就会提前扩容。CPython的集合实现会在元素数量增长时,同时扩容哈希表和元素存储数组,这两个操作的内存变化会被sys.getsizeof一并统计,导致内存跳跃点看起来和负载因子计算的阈值不符。
  • 后续在第19个元素时再次扩容,同样是因为内部缓冲区的扩容逻辑,而非单纯的负载因子触发。

验证负载因子的正确方式

如果想直接验证集合的负载因子,可以查看CPython的源码(setobject.c和setobject.h),其中明确定义了:

#define _PySet_MAXFILL 7 /* 7/8 full at maximum */

这意味着当集合中活跃元素的数量超过桶数的7/8时,才会触发哈希表的扩容。

内容的提问来源于stack exchange,提问作者user2422552

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 01:40:22