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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:33:14