Python含None值的键值对是否被优化?内存占用疑问
嵌套字典移除None值键值对的内存优化疑问
问题背景
我有一个外层键为整数、值为字典的嵌套字典,内层字典存在稀疏特性。我构建了两个版本:
a_it_1:保留值为None的键值对a_it_2:直接移除这类键值对,尝试节省内存
实际字典包含超过10000个外层键值对,用Pympler的asizeof模块检测后,两者内存占用均为12.3MB。我有两个疑问:
- 为什么两者内存占用完全相同?
- 移除未设置值的键值对到底有没有内存优化收益?
对应的字典推导式如下:
保留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
相关产品推荐
相关产品推荐

