广播 numpy 数组的底层缓冲区使用了多少内存?



请注意,nbytes没有提供正确的值。例如:

>>> n = 1000
>>> x = np.arange(n)
>>> bx = np.broadcast_to(x, (int(1e15), n))
>>> bx.nbytes
8e18

....这可能需要比地球上更多的 RAM。

编辑:更具体地说,有没有办法获取bx引用的缓冲区的大小?大致如下:

>>> x.nbytes
8000
>>> bx.underlying_buffer_size()
8000

请注意,正如您在文档中所看到的,broadcast_to从文档中返回一个视图,其中广播数组可能引用单个内存位置

广播:阵列 具有给定形状的原始数组上的只读视图。是的 通常不连续。此外,一个以上的元素 广播阵列可以指单个内存位置。

因此,在这种情况下,所有新行都指向相同的内存位置。

为了以字节为单位查看对象的实际大小,您可以使用sys.getsizeof

from sys import getsizeof
getsizeof(bx)
112

这可以通过检查内部数组的实际身份来查看:

id(bx[0])
# 1434315204368
id(bx[1])
# 1434315203968

最新更新