web-dev-qa-db-ja.com

Pythonの変数のメモリサイズ

私はPythonいくつかの大きな数の計算を行うためのコードを書いており、計算で使用されるメモリについて深刻な懸念を持っています。

したがって、各変数のすべてのビットをカウントします。

たとえば、変数xがあり、これは大きな数であり、xを表すためにビット数をカウントしたいです。

次のコードは明らかに役に立たない:

x=2**1000
len(x)

したがって、次のコードを使用します。

x=2**1000
len(repr(x))

変数xは(10進数)です:

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559161616

しかし、上記のコードはを返します

上記の長い長いシーケンスの長さは302であるため、は文字列の長さのみに関連していると考えています。

だから、ここに私の元の質問が来ます:

変数xのメモリサイズを知るにはどうすればよいですか?

もう一つ; C/C++言語で、定義する場合

int z=1;

これは、zに4バイト= 32ビットが割り当てられ、ビットが00..001(31 0と1 1)として配置されることを意味します。

ここで、変数xは巨大です。同じメモリ割り当てルールに従っているかどうかわかりませんか?

46
user4478

つかいます - sys.getsizeof オブジェクトのサイズをバイト単位で取得します。

>>> from sys import getsizeof
>>> a = 42
>>> getsizeof(a)
12
>>> a = 2**1000
>>> getsizeof(a)
146
>>>

オブジェクトのサイズとレイアウトは純粋に実装固有であることに注意してください。たとえば、CPythonはIronPythonとはまったく異なる内部データ構造を使用する場合があります。そのため、オブジェクトのサイズは実装ごとに異なる場合があります。

91

Python longの内部構造については、sys.int_info(またはPython 2.7の場合はsys.long_info)を確認してください。

>>> import sys
>>> sys.int_info
sys.int_info(bits_per_digit=30, sizeof_digit=4)

Pythonは、30ビットを4バイト(ほとんどの64ビットシステム)に格納するか、15ビットを2バイト(ほとんどの32ビットシステム)に格納します。実際のメモリ使用量と計算値を比較すると、

>>> import math, sys
>>> a=0
>>> sys.getsizeof(a)
24
>>> a=2**100
>>> sys.getsizeof(a)
40
>>> a=2**1000
>>> sys.getsizeof(a)
160
>>> 24+4*math.ceil(100/30)
40
>>> 24+4*math.ceil(1000/30)
160

ビットが保存されないため、0には24バイトのオーバーヘッドがあります。大きな値のメモリ要件は、計算値と一致します。

数値が非常に大きいため、6.25%の未使用ビットが気になる場合は、おそらく gmpy2 ライブラリを確認する必要があります。内部表現は利用可能なすべてのビットを使用し、大きな値(たとえば、100桁を超える)の計算は非常に高速です。

5
casevh