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

Hai*_*ang 5 python numpy

我想创建一个小的NumPy整数来节省内存.但是,我注意到了

import numpy,sys
print sys.getsizeof(numpy.int8(1))
Run Code Online (Sandbox Code Playgroud)

打印12,所以它似乎numpy.int8()生成12个字节而不是1个字节的数据.为什么是这样?

mar*_*ard 6

Numpy 标量具有与 CPython 数据类型类似的实现,例如 python 浮点数或整数类型。换句话说,它是一个包含三个变量的结构体:

  • 类型的引用计数器int

  • 指向其对象类型实例的指针

  • 变量的值

在 32 位体系结构中,引用计数器和指针通常各为 4 个字节。value 字段原则上可以是任意大小,但结构填充会导致结构分配 4 个字节,即使 value 需要更少。

如果您使用的是 64 位架构,请将“4 字节”替换为“8 字节”。

因此,32 位系统上的所有 numpy 整数由(实际上)三个 4 字节变量组成,并sys.getsizeof(numpy.int8(1))给出 12。在 64 位系统上,它将返回 24。

大多数 numpy 标量的大小相同。一个例外是numpy.complex类型,它通常需要双重存储。由于这在内存中与其他两个变量对齐,因此您可以忽略填充并简单地将分配给该值的字节加倍,分别在 32 位和 64 位中给出 16 和 32 字节。类似的规则适用于更奇异的类型(complex256float80,等)