2012-04-29 4 views
4

メモリを節約するために、小さなNumPy整数を作成します。しかし、私はなぜsys.getsizeof(numpy.int8(1))が12を返しますか?

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

プリント12numpy.int8()は12バイトの代わりに、1バイトのデータを生成していると思われていることに気づきました。どうしてこれなの?

+7

pythonでは、すべてのオブジェクトに大きなオーバーヘッドがあります( 'dir(numpy.int8(1))'を実行してみてください)。メモリを節約して、おそらく配列を使ってPythonでオブジェクトを作成する固定コストを分配するべきです。 –

+10

'nbytes'と' itemsize'の出力を調べたいと思うかもしれません:例えば 'numpy.arange(10000 、dtype = numpy.int8).itemsize == 1'とnumpy.arange(10000、dtype = numpy.int32).nbytes == 40000となります。 – DSM

答えて

3

ナンシースカラーは、Pythonの浮動小数点型や整数型などのCPythonデータ型と同様の実装を持っています。タイプint

    • reference counterそのオブジェクトタイプ

    • のインスタンスへのポインタ変数

    • の値:他の言葉では、これは3つの変数を含む構造体であります

    リファレンスカウンタとポインタは、通常、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バイトを与えます。 complex256float80など)

  • 関連する問題