python del 关键字不适用于 numpy 数组

python del keyword doesn't work on numpy arrays

提问人:maximus_ow 提问时间:11/9/2023 最后编辑:maximus_ow 更新时间:11/10/2023 访问量:59

问:

我在 Colab 中测试了以下两个代码片段。

第一个是列表列表。

a = []
for i in range(100000):
  a.append([0 for _ in range(10000)])

运行此命令后,系统RAM从1.0 GB跃升至8.8 GB。然后我尝试删除此列表。

del a

系统RAM恢复到1.0 GB。

现在我用numpy数组列表尝试同样的事情

import numpy as np
b = []
for i in range(100000):
  b.append(np.zeros(10000))

系统 RAM 从 1.0 GB 跃升至 7.6 GB。但是现在当我尝试删除它时:

del b

什么也没发生!

这种行为背后的原因是什么?
如何删除?
b

提前致谢

python numpy 内存 google-colaboratory del

评论

1赞 Tim Roberts 11/9/2023
numpy是用 C 和 Fortran 编写的。它执行不属于 Python 垃圾回收规则的内部内存分配。内存最终会被回收,但它不在 Python 的控制之下。这也可能是堆碎片的情况。
1赞 juanpa.arrivillaga 11/9/2023
您无法在 Python 中删除对象。在上述两种情况下,都完全按照预期工作:它删除了名称或从全局命名空间中删除。 不会删除对象(python 没有直接的方法来执行此操作,它是一种内存管理语言),它会删除名称delbadel
1赞 juanpa.arrivillaga 11/9/2023
@Barmar可能不会影响任何事情,我认为这里没有理由进行任何参考周期
1赞 juanpa.arrivillaga 11/9/2023
@Barmar不,不能保证这一点。在 CPython 中,一旦对象的引用计数达到 0,内部堆将立即回收对象,当然,这并不意味着内存会从进程中释放回操作系统。
1赞 juanpa.arrivillaga 11/10/2023
@maximus_ow您没有手动删除该列表。引用计数变为零,垃圾回收会自动处理它。您无法在 Python 中手动删除对象。至于为什么进程的内存使用率下降,这可能取决于您的操作系统。在我的计算机上,内存会随着 numpy 数组列表一起释放,就像使用列表列表一样。

答: 暂无答案