python(63): dict: del/pop不释放内存

Python中的字典,只有不再使用的时候才会释放对应的内存。在使用 pop 或者 delete 删除字典中的item(或者说entry)后,为了保证hash table 探测链的完整,那个被删除的entry只是被标记成了空,并没有真正被删除掉,所以该字典的内存占用没有得到释放。这是为了避免多度重建hash table。

释放内存

那如何释放字典的内存?现已知的方案是创建或者拷贝一个旧字典再覆盖掉新字典。具体示例如下:

复制代码
import sys
import gc
import copy
a = {}
print("init empty dict memory size={} bytes".format(sys.getsizeof(a)))

for i in range(10**6):
    a[i] = i
print("after set value, dict memory size={} bytes".format(sys.getsizeof(a)))

for i in range(10**6):
    del a[i]
    # a.pop(i)

print("after del, dict memory size={} bytes".format(sys.getsizeof(a)))
a_new = dict(a)
print("after init a new one, dict memory size={} bytes".format(sys.getsizeof(a_new)))
b = copy.copy(a)
print("after copy a new one, dict memory size={} bytes".format(sys.getsizeof(b)))
c = copy.deepcopy(a)
print("after deepcopy a new one, dict memory size={} bytes".format(sys.getsizeof(c)))

运行结果如下:

复制代码
init empty dict memory size=240 bytes
after set value, dict memory size=41943144 bytes
after del, dict memory size=41943144 bytes
after init a new one, dict memory size=240 bytes
after copy a new one, dict memory size=240 bytes
after deepcopy a new one, dict memory size=240 bytes

参考文档;

Python应用专题 | 11:如何释放字典的内存占用?-阿里云开发者社区

相关推荐
xyliiiiiL21 分钟前
从责任链模式聊到aware接口
java·开发语言
Elec_z1 小时前
网络深处的守门人
开发语言·网络
闪电麦坤952 小时前
C#:Time.deltaTime
开发语言·c#
moz与京3 小时前
[附C++,JS,Python题解] Leetcode 面试150题(10)——轮转数组
c++·python·leetcode
什码情况4 小时前
回文时间 - 携程机试真题题解
数据结构·python·算法·华为od·机试
Alfadi联盟 萧瑶4 小时前
Python-Django入手
开发语言·python·django
-代号95275 小时前
【JavaScript】十二、定时器
开发语言·javascript·ecmascript
漠北尘-Gavin6 小时前
【Python3.12.9安装llama-cpp-python遇到编译报错问题解决】
python·llama
勘察加熊人6 小时前
c++实现录音系统
开发语言·c++
self-discipline6346 小时前
【Java】Java核心知识点与相应面试技巧(七)——类与对象(二)
java·开发语言·面试