メモリを節約するために小さなNumPy整数を作成したいと思います。しかし、私はそれに気づきました
import numpy,sys
print sys.getsizeof(numpy.int8(1))
を出力12
するのでnumpy.int8()
、1バイトのデータではなく12バイトを生成しているようです。どうしてこれなの?
Numpyスカラーには、Python浮動小数点型や整数型などのCPythonデータ型と同様の実装があります。つまり、次の3つの変数を含む構造体です。
タイプの参照カウンターint
そのオブジェクトタイプのインスタンスへのポインタ
変数の値
参照カウンタとポインタは通常、32ビットアーキテクチャではそれぞれ4バイトになります。値フィールドは原則として任意のサイズにすることができますが、構造体のパディングにより、必要な値が少なくても、構造体は4バイトを割り当てます。
64ビットアーキテクチャで作業している場合は、「4バイト」を「8バイト」に置き換えます。
したがって、32ビットシステム上のすべてのnumpy整数は、(事実上)3つの4バイト変数で構成され、sys.getsizeof(numpy.int8(1))
12を返します。64ビットシステムでは、24を返します。
ほとんどのnumpyスカラーは同じサイズです。1つの例外はnumpy.complex
タイプで、通常は2つのストレージが必要です。これはメモリ内で他の2つの変数と整列するため、パディングを無視して、値に割り当てられたバイトを2倍にするだけで、32ビットと64ビットでそれぞれ16バイトと32バイトになります。同様のルールが、よりエキゾチックなタイプ(、、など)にも適用されcomplex256
ますfloat80
。