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

Numpy使用自身部分视图覆盖数组时的内存管理问题

Numpy切片赋值后的内存管理问题

先看你给出的代码:

original = np.ones(1000000000, dtype=np.int8).reshape(10, 10000, 10000)  # 1GB in size
original = original[0, :, :]  # 0.1GB in size?

你关心的是执行第二次赋值时,Numpy是否会做以下操作:

  • 将original的前100000000个元素复制到新数组中
  • 释放原original的全部内存
  • 将名称original指向新的0.1GB数组

同时你明确了单独的original[0, :, :]是partial view,不会触发内存分配,想知道赋值后原1GB内存是否保留。


答案是不会执行你说的这三个步骤,原1GB内存不会立刻被释放,具体逻辑如下:

  • original[0, :, :]本质是原数组的视图(view),它不会开辟新的内存存储数据,只是记录了对原数组数据的引用、切片的形状和步长信息,本身内存占用可以忽略。
  • 执行original = original[0, :, :]时,只是把变量名original的指向从原来的1GB数组,切换到了这个视图对象上。
  • 此时原1GB数组并没有被释放,因为视图对象还持有对它的引用,Python的垃圾回收机制只会回收没有任何引用的对象内存。
  • 只有当这个视图对象也不再被任何变量引用时,原数组才会失去所有关联引用,最终被垃圾回收器回收内存。

简单说:这次赋值没有复制数据,原1GB内存会被视图“挂住”而保留,直到视图本身也被销毁,才会被回收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:35:20