6

メモリを節約するために小さなNumPy整数を作成したいと思います。しかし、私はそれに気づきました

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

を出力12するのでnumpy.int8()、1バイトのデータではなく12バイトを生成しているようです。どうしてこれなの?

4

1 に答える 1

6

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

于 2012-05-31T05:52:00.143 に答える