请注意,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