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'可能引用未分配的内存吗?
我还有其他一些问题:
以下内容应该澄清一点:
>>> 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对象应该丢失它的最后一个引用并自动被垃圾收集.