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

Python 广播的numpy数组的底层缓冲区使用了多少内存?,python,numpy,memory,Python,Numpy,Memory,请注意,n字节没有提供正确的值。例如: >>> n = 1000 >>> x = np.arange(n) >>> bx = np.broadcast_to(x, (int(1e15), n)) >>> bx.nbytes 8e18 …这可能需要比地球上更多的内存 EDIT:更具体地说,是否有方法获取bx引用的缓冲区大小?大致如下: >>> x.nbytes 8000 >>> bx.un

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

>>> n = 1000
>>> x = np.arange(n)
>>> bx = np.broadcast_to(x, (int(1e15), n))
>>> bx.nbytes
8e18
…这可能需要比地球上更多的内存

EDIT:更具体地说,是否有方法获取
bx
引用的缓冲区大小?大致如下:

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

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

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

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

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

from sys import getsizeof

getsizeof(bx)
112

这可以通过检查内部阵列的实际标识来看出:

id(bx[0])
# 1434315204368

id(bx[1])
# 1434315203968

请参阅文档:
所有内置对象都将返回正确的结果,但这对于第三方扩展不一定适用,因为它是特定于实现的。只考虑直接归因于对象的内存消耗,而不考虑它所指对象的内存消耗。
。第三方LIB可以自由地按照他们认为合适的方式实现这一点,并且可以解释或不解释他们持有的任何大块mem(可能通过间接方式)。回答如下: