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

为何Python del关键字无法释放Numpy数组列表内存?如何解决?

问题分析与解决方法

现象原因

1. 列表的列表内存能正常释放

第一段代码里的a是Python内置列表组成的列表,所有元素(内层列表、整数0)都是Python原生对象,它们的内存完全由Python的垃圾回收(GC)机制管理。当执行del a后,整个列表以及内部所有对象的引用计数直接归零,Python GC会立即回收这些内存,所以系统内存很快恢复到初始状态。

2. Numpy数组列表内存无法自动释放

第二段代码里的b是Numpy数组组成的列表,Numpy数组的实际数据存储在C语言分配的堆外内存中,Python层面的np.ndarray对象只是一个“包装器”,持有指向C层内存的指针:

  • 执行del b时,只是删除了Python层面的列表对象,以及每个Numpy数组的包装器对象,但这些包装器的引用计数归零后,Numpy不会立刻主动释放C层内存;
  • 另外,Python的GC默认不会主动清理这些包装器对象(除非内存压力很大),再加上系统内存回收机制(比如Linux的页缓存)的延迟,导致Colab显示的内存没有变化。

释放内存的方法

要彻底释放b占用的内存,可以按以下步骤操作:

import gc
import numpy as np

# 先清空列表,让所有Numpy数组的包装器失去引用
b.clear()
# 删除列表本身
del b
# 强制触发Python垃圾回收,清理包装器对象,进而触发Numpy释放C层内存
gc.collect()

也可以简化为:

import gc
del b
gc.collect()

先调用clear()能更快让内部数组的引用计数归零,加速内存释放。如果只是临时使用单个Numpy数组,也可以在不需要时直接del b[i],避免大量内存堆积。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:32:19