为什么sys.getsizeof(numpy.int8(1))返回12?

6
我想创建一个小的NumPy整数以节省内存。但是,我注意到:
import numpy,sys
print sys.getsizeof(numpy.int8(1))

输出 12,看起来 numpy.int8() 生成了 12 字节而不是 1 字节的数据。为什么会这样?


7
在Python中,所有对象都有很多开销(可以尝试使用“dir(numpy.int8(1))”来查看)。如果你真的关心节省内存,最好使用数组来分配在Python中创建对象的固定成本。 - Joel Cornett
10
你可能会对查看 nbytesitemsize 的输出感兴趣:例如,numpy.arange(10000,dtype=numpy.int8).itemsize == 1numpy.arange(10000,dtype=numpy.int32).nbytes == 40000。请注意,这些内容是原文的翻译,我没有进行任何解释或添加额外的信息。 - DSM
1个回答

6
Numpy标量的实现与CPython数据类型(例如Python浮点类型或整数类型)类似。换句话说,它是一个包含三个变量的结构体:
- 一个 int 类型的引用计数器 - 指向其对象类型实例的指针 - 变量的值
在32位体系结构中,引用计数器和指针通常每个4个字节。原则上,值字段可以是任何大小,但是结构填充将导致struct分配4个字节,即使值需要更少。
如果您正在使用64位体系结构,请将“4字节”替换为“8字节”。
因此,在32位系统上,所有numpy整数都由(有效地)三个4字节变量组成,sys.getsizeof(numpy.int8(1))返回12。在64位系统上,它将返回24。
大多数numpy标量的大小相同。一个例外是numpy.complex类型,它通常需要双倍存储。由于这与其他两个变量在内存中对齐,因此您可以忽略填充并简单地将分配给该值的字节加倍,分别为32位和64位中的16和32字节。类似的规则适用于更奇异的类型(complex256float80等)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接