我试图确定python中不同数据类型的大小,并编写了以下代码。每行的输出在它们旁边显示为注释。
import numpy as np
import sys
print(sys.version) # 3.6.7
print(np.version.version) # 1.15.4
i = 2
print(type(i)) # <class 'int'>
print(sys.getsizeof(i)) # 28
j = np.int64(3)
print(type(j)) # <class 'numpy.int64'>
print(sys.getsizeof(j)) # 32
a = np.array([[1,2],[3,4],[5,6]])
print(type(a)) # <class 'numpy.ndarray'>
print(sys.getsizeof(a)) # 160
print(type(a[0][0])) # <class 'numpy.int64'>
print(sys.getsizeof(a[0][0])) # 32
a = np.array([[1,2],[3,4],[5,6],[7,8]])
print(sys.getsizeof(a)) # 176
从上面的输出中,一个6元素数组的大小为160,而一个8元素数组的大小为176,所以我可以得出结论,数组中每个元素的大小为8字节,并且数组标头的大小(常数)是112个字节?每个元素的大小是恒定的还是取决于其值(大还是小)?
另外,当我打印a [0] [0]的大小时,为什么我得到32而不是8? python和numpy整数和数组背后的数学到底是什么?
答案 0 :(得分:0)
实际上,“ sys.getsizeof ”不适用于确定numpy中的大小。它只适用于内置的python对象。
以字节为单位返回对象的大小。该对象可以是任何类型的对象。所有内置对象都将返回正确的结果,但是对于第三方扩展,这不一定成立,因为它是特定于实现的。
getsizeof()调用对象的 sizeof 方法,如果该对象由垃圾收集器管理,则会添加额外的垃圾收集器开销。
对于 numpy.ndarray 使用 nbytes ,它是 size * itemsize
a = np.array([[3,4],[8,0],[9,8],[7,0]])
a.size # 8
a.itemsize # 8
a.nbytes # 64
a = np.array([[3,4],[8,0],[9,8],[7,0]],dtype=np.int32)
a.size # 8
a.itemsize # 4
a.nbytes # 32