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

时间:2012-04-29 03:53:48

标签: python numpy

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

import numpy,sys
print sys.getsizeof(numpy.int8(1))

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

1 个答案:

答案 0 :(得分:4)

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

在32位体系结构中,引用计数器和指针通常都是4个字节。值字段原则上可以是任何大小,但structure padding将导致struct分配4个字节,即使值需要更少。

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

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

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