Numpy阵列内存管理

DSn*_*net 5 memory arrays numpy

我有一个关于Numpy数组内存管理的问题.假设我使用以下内容从缓冲区创建一个numpy数组:

>>> s = "abcd"
>>> arr = numpy.frombuffer(buffer(s), dtype = numpy.uint8)
>>> arr.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : False
  WRITEABLE : False
  ALIGNED : True
  UPDATEIFCOPY : False
>>> del s # What happens to arr?
Run Code Online (Sandbox Code Playgroud)

在上面的情况中,'arr'是否持有's'的引用?如果我删除's',这会释放为's'分配的内存,从而使'arr'可能引用未分配的内存吗?

我还有其他一些问题:

  • 如果这是有效的,Python如何知道何时释放's'分配的内存?gc.get_referrents(arr)函数似乎没有显示'arr'包含对's'的引用.
  • 如果这是无效的,我如何将's'的引用注册到'arr',以便Python GC在所有对它的引用都消失后会自动获得's'?

Jai*_*ime 6

以下内容应该澄清一点:

>>> s = 'abcd'
>>> arr = np.frombuffer(buffer(s), dtype='uint8')
>>> arr.base
<read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03D1BA00>
>>> del s
>>> arr.base
<read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03D1BA00>
Run Code Online (Sandbox Code Playgroud)

在第一种情况下del s没有任何效果,因为数组指向的是buffer从它创建的,在其他任何地方都没有引用.

>>> t = buffer('abcd')
>>> arr = np.frombuffer(t, dtype='uint8')
>>> arr.base
<read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03C8D920>
>>> arr.base is t
True
>>> del t
>>> arr.base
<read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03C8D920>
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,当你del t,你摆脱t指向该buffer对象的变量,但由于该数组仍然具有对该对象的引用buffer,它不会被删除.虽然我不确定如何检查它,但如果你现在del arr,该buffer对象应该丢失它的最后一个引用并自动被垃圾收集.