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

Python含None值的键值对是否被优化?内存占用疑问

嵌套字典移除None值键值对的内存优化疑问

问题背景

我有一个外层键为整数、值为字典的嵌套字典,内层字典存在稀疏特性。我构建了两个版本:

  • a_it_1:保留值为None的键值对
  • a_it_2:直接移除这类键值对,尝试节省内存

实际字典包含超过10000个外层键值对,用Pympler的asizeof模块检测后,两者内存占用均为12.3MB。我有两个疑问:

  1. 为什么两者内存占用完全相同?
  2. 移除未设置值的键值对到底有没有内存优化收益?

对应的字典推导式如下:

保留None值的版本

a_it_1 = {k: {p: vi if type(vi) == int or type(vi) == bool or len(vi) > 0 else None for p, vi in v.items() if vi is not None} for k, v in a_it.items() if k < 10000}

移除None值的版本

a_it_2 = {k: {p: vi for p, vi in v.items() if vi is not None and (type(vi) == int or type(vi) == bool or len(vi) > 0)} for k, v in a_it.items() if k < 10000}

问题解答

为什么内存占用相同?

  • Python字典的预分配机制:Python字典会预先分配哈希表空间(默认负载因子0.66),只有当字典元素数量减少到一定阈值时,才会触发哈希表收缩。如果你的内层字典中,移除的None值键数量不多,哈希表的实际占用空间和保留None时没有差异,整体内存自然看不出变化。
  • None是单例对象:所有指向None的引用都共享同一个实例,存储None值并不会额外消耗太多内存——只是多了一个键值对条目,但这个条目的开销远小于字典哈希表的预分配空间。
  • 测量精度限制:asizeof的结果是近似值,12.3MB的精度掩盖了两者之间的细微内存差异。

移除None值键值对是否有内存优化收益?

  • 有,但依赖具体场景:
    • 当内层字典的None值键数量较多,且字典规模足够大时,移除这些键会降低元素数量,当低于哈希表收缩阈值时,Python会自动缩小哈希表,从而释放内存。
    • 除了内存,移除None值还能减少后续遍历、序列化等操作的时间开销,提升代码运行效率。
  • 当前场景未体现收益的原因:你的测试中,要么是None值键的数量太少,要么是内层字典的哈希表还没触发收缩机制,导致内存差异无法被检测到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:06:25