83

私は大きな数の計算を行う Python コードを書いていますが、計算に使用されるメモリについて深刻な懸念があります。

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

たとえば、大きな数値である変数xがあり、 xを表すビット数をカウントしたいとします。

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

x=2**1000
len(x)

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

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

変数xは (10 進数で) 次のとおりです。

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

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

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

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

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

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

int z=1;

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

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

4

2 に答える 2

160

sys.getsizeofオブジェクトのサイズをバイト単位で取得するために使用します。

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

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

于 2013-01-17T04:02:54.723 に答える
7

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桁を超える)の計算は大幅に高速化されます。

于 2013-01-17T05:03:57.550 に答える