メモリを節約するために、小さなNumPy整数を作成します。しかし、私はなぜsys.getsizeof(numpy.int8(1))が12を返しますか?
import numpy,sys
print sys.getsizeof(numpy.int8(1))
プリント12
、numpy.int8()
は12バイトの代わりに、1バイトのデータを生成していると思われていることに気づきました。どうしてこれなの?
メモリを節約するために、小さなNumPy整数を作成します。しかし、私はなぜsys.getsizeof(numpy.int8(1))が12を返しますか?
import numpy,sys
print sys.getsizeof(numpy.int8(1))
プリント12
、numpy.int8()
は12バイトの代わりに、1バイトのデータを生成していると思われていることに気づきました。どうしてこれなの?
ナンシースカラーは、Pythonの浮動小数点型や整数型などのCPythonデータ型と同様の実装を持っています。タイプint
の
reference counterそのオブジェクトタイプ
のインスタンスへのポインタ変数
リファレンスカウンタとポインタは、通常、32ビットアーキテクチャではそれぞれ4バイトです。値フィールドは原則どんなサイズでも構いませんが、structure paddingは、値がそれほど必要でなくても、構造体に4バイトを割り当てさせます。
64ビットアーキテクチャで作業している場合は、「4バイト」を「8バイト」に置き換えます。
ので、32ビットシステム上のすべてのnumpyの整数(効果)で構成されて3つの4バイトの変数、およびsys.getsizeof(numpy.int8(1))
は、64ビットシステム上で12を与え、それが24
ほとんどnumpyのスカラを返します同じサイズです。 1つの例外はnumpy.complex
タイプですが、通常は2重のストレージが必要です。これはメモリ内で他の2つの変数と整列するので、パディングを無視して、値に割り当てられたバイトを単純に2倍にして、32ビットと32ビットでそれぞれ16と32バイトを与えます。 complex256
、float80
など)
pythonでは、すべてのオブジェクトに大きなオーバーヘッドがあります( 'dir(numpy.int8(1))'を実行してみてください)。メモリを節約して、おそらく配列を使ってPythonでオブジェクトを作成する固定コストを分配するべきです。 –
'nbytes'と' itemsize'の出力を調べたいと思うかもしれません:例えば 'numpy.arange(10000 、dtype = numpy.int8).itemsize == 1'とnumpy.arange(10000、dtype = numpy.int32).nbytes == 40000となります。 – DSM