Key-Sharing Dictionaries中sys.getsizeof测量范围及版本差异问询
键共享字典与sys.getsizeof相关疑问解答
1. sys.getsizeof的测量范围
你对键共享字典的机制理解准确:当大量实例拥有相同键集合时,它们会共用一份共享键表(Shared Keys Table),每个实例仅维护自身的**值数组(Value Array)**及少量内部元数据。
sys.getsizeof(vars(colors))返回的数值,仅统计当前实例对应字典对象自身的内存占用——包括值数组、指向值的指针、字典内部的管理元数据(如哈希冲突处理信息、状态标记等),但不包含共享键表的内存(因为共享键表是多实例共用的,不会计入单个实例的字典大小)。
2. 替换值为超长对象后结果不变的原因
确实如此,因为字典中存储的是**对象的引用(指针)**而非对象本身。在64位系统中,每个指针的大小固定为8字节(32位系统为4字节),无论你存入短字符串、超长字符串还是大整数,字典里仅保存指向这些对象的指针。sys.getsizeof只统计字典自身的结构内存(包括这些指针的总大小),不会递归统计指针指向的目标对象的内存占用。
示例验证:
import sys class Color: def __init__(self, r, g, b): self.r = r self.g = g self.b = b colors = Color(255, 0, 0) print(sys.getsizeof(vars(colors))) # 3.12.5中返回296 colors.r = "a" * 1000000 # 替换为超长字符串 print(sys.getsizeof(vars(colors))) # 仍返回296,仅指针替换,指针总大小不变
3. Python 3.12与3.10数值差异的原因
这个差异源于Python字典底层实现的变更,而非sys.getsizeof的工作逻辑改变。
Python 3.12对字典(包括实例的__dict__,即vars()返回的对象)的内部结构做了优化调整:
- 新增了用于提升查找性能的内部缓存字段
- 调整哈希表布局,增加额外元数据以支持更高效的键共享和冲突处理
- 强化了内存安全相关的内部结构
这些变更直接导致单个实例字典的基础内存占用增大,sys.getsizeof只是如实报告了结构的实际内存大小。
内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows
相关产品推荐
相关产品推荐

