web-dev-qa-db-ja.com

Python基本型のメモリ使用量(特にintおよびfloat))

これはPython 3.8.0インタープリターの例です(ただし、3.7.5でも同様です)。

_>>> import sys
>>> sys.getsizeof(int)
416
>>> sys.getsizeof(float)
416
>>> sys.getsizeof(list)
416
>>> sys.getsizeof(Tuple)
416
>>> sys.getsizeof(dict)
416
>>> sys.getsizeof(bool)
416
_

getsizeof()は、ガベージコレクタのオーバーヘッドと共にPythonオブジェクトが消費するバイト数を返します( here を参照)。基本的なpythonクラスが同じ量のメモリを消費する理由は何ですか?

これらのクラスのインスタンスを見てみると

_>>> import sys
>>> sys.getsizeof(int())
24
>>> sys.getsizeof(float())
24
_

デフォルトの引数は_0_であり、これらの2つのインスタンスは、この引数に対して同じ量のメモリを使用します。ただし、引数を追加しようとすると

_>>> sys.getsizeof(int(1))
28
>>> sys.getsizeof(float(1))
24
_

これが奇妙なところです。インスタンスのメモリ使用量がintで増加するのに、float型では増加しないのはなぜですか?

6
vezeli

ドキュメント を見ると、次のことに注意することが重要です。

オブジェクトに直接起因するメモリ消費のみが考慮され、オブジェクトが参照するオブジェクトのメモリ消費は考慮されません。

では、sys.getsizeof(int(1))の戻り値がsys.getsizeof(float(1))の戻り値より大きいという事実から何を推測できますか?

単に、intを表すよりもfloatを表す方が多くのメモリを必要とします。これは意外ですか?まあ、そうではないかもしれませんが、intで実行できるよりもfloatで「より多くのことを行う」ことが期待できる場合。属性の数を調べることにより、「機能の量」を一次的に測定できます。

>>> len(dir(int))
70
>>> len(dir(float))
57
1
gst