すべてはオブジェクトです
Python では、あらゆる種類の定数と変数、整数、ブール値、さらには関数も含めて、すべてがオブジェクトです。 stackoverflow の質問を参照してください。ruby のような Python のすべてのオブジェクトですか
コードで確認できます:
# Python のすべてのものが object def fuction(): return print isinstance(True, object) print isinstance(0, object) ) print isinstance('a', object) print isinstance(fuction, object)
計算方法
Pythonでは、Pythonオブジェクトのサイズを計算するための関数getsizeofがsysモジュールに用意されています。
sys.getsizeof(object[, default]) 以字节(byte)为单位返回对象大小。 这个对象可以是任何类型的对象。 所以内置对象都能返回正确的结果 但不保证对第三方扩展有效,因为和具体实现相关。 ...... getsizeof() 调用对象的 __sizeof__ 方法, 如果对象由垃圾收集器管理, 则会加上额外的垃圾收集器开销。
もちろん、オブジェクトのメモリ使用量は Python のバージョンとオペレーティング システムのバージョンに密接に関係しています。この記事のコードとテスト結果は Windows7 32 ビット オペレーティング システムに基づいています。
import sys print sys.version
2.7.2 (デフォルト、2011年6月24日12:21:10) [MSC v.1500 32 bit (Intel)]
基本型
•Boolean
print 'サイズTrue のサイズ: %d' % (sys.getsizeof(True)) print 'False のサイズ: %d' % (sys.getsizeof(False))
出力:
True のサイズ: 12 False のサイズ: 12
•整数型
# 通常の整数 print '整数のサイズ: %d' % (sys.getsizeof(1)) # long print 'long 整数のサイズ: %d' % (sys.getsizeof(1L)) print '大きな長整数のサイズ: %d' % (sys.getsizeof(100000L)) 出力:
整数のサイズ: 12x 長整数 1L のサイズ: 14 長整数 100000L のサイズ: 16
整数の占有 12 がわかります。長整数は少なくとも 14 バイトを占有し、桁数が増加するにつれて占有されるスペースも大きくなります。 バージョン 2.x では、整数型の値が sys.maxint を超えると、自動的に長整数に拡張されます。 Python 3.0 以降、整数と長整数は 1 つの型に統合されます。
•浮動小数点型
print 'floatのサイズ: %d' % (sys.getsizeof(1.0))
出力:
floatのサイズ: 16
浮動小数点型は16バイトを占有します。一定の精度を超える場合は四捨五入されます。
次のコードを参照してください:
print 1.00000000003 print 1.000000000005
出力:
1.00000000003 1.00000000001
•String
# 文字列型のサイズ print 'rn'.join([" %d 文字の文字列のサイズ: %d" % (len(elem), sys.getsizeof(elem)) for elem in ["", "a", "ab"]]) # Unicode 文字列のサイズ print 'rn'.join(["size %d 文字の Unicode 文字列: %d" % (len(elem), sys.getsizeof(elem)) for elem in [u"", u"a", u"ab"]])
出力:
0 文字の文字列のサイズ: 21 1 文字の文字列のサイズ: 22 2 文字の文字列のサイズ: 23 0 文字の Unicode 文字列のサイズ: 26 1 文字の Unicode 文字列のサイズ: 28 2 文字の Unicode 文字列のサイズ: 30
通常の空の文字列は 21 バイトを占め、追加の文字はさらに 1 バイトを占めます。 Unicode 文字列は最小 26 バイトを占有し、追加の文字ごとにさらに 2 バイトを占有します。
コレクション型
•List
# リスト型のサイズ print 'rn'.join(["%d 要素を含むリストのサイズ: %d" % (len(elem), sys.getsizeof(elem)) for elem in [[], [0], [0,2], [0,1,2]]])
出力:
要素 0 のリストのサイズ: 36 要素 1 のリストのサイズ: 40 2 つの要素を持つリストのサイズ: 44 3 つの要素を持つリストのサイズ: 48
リストは少なくとも 36 バイトを占め、追加の要素ごとに 4 バイトずつ増加することがわかります。ただし、sys.getsizeof 関数はコンテナー タイプの要素サイズを計算しないことに注意してください。例:
print '3 つの整数 %d を含むリストのサイズ' % (sys.getsizeof([0,1,2])) print '3 つの文字列 %d を含むリストのサイズ' % (sys.getsizeof([' 0 ','1','2']))
出力:
3 つの整数を含むリストのサイズ 48 3 つの文字列を含むリストのサイズ 48
コンテナに保存されるものは要素への参照である必要があります。コンテナを正確に計算したい場合は、再帰的な sizeof レシピを参照できます。与えられる total_size 関数を使用します:
print '3 つの整数 %d を含むリストの合計サイズ' % (total_size([0,1,2])) print '3 つの文字列を含むリストの合計サイズ %d' % (total_size ( ['0','1','2']))
出力は次のとおりです:
3 つの整数を含むリストの合計サイズ 84 3 つの文字列を含むリストの合計サイズ 114
リストは基本的なスペース 36 + (オブジェクト参照 4 + オブジェクト サイズ) * 要素の数です。
また、リスト変数を宣言すると、要素を追加する際の効率を上げるためにスペースが事前に割り当てられることにも注意してください:
li = [] for i in range(0, 101): print 'list with %d integers size : %d, total_size: %d' % (i, getsizeof(li), total_size(li)) li.append(i)
•タプル
は基本的にリストに似ていますが、少なくとも28文字必要ですお祭り。
•辞書
もちろん、辞書の状況は比較的複雑です。詳細については、コード dictobject.c を参照してください。さらに、「辞書の最適化に関する注意」を注意深く読む必要があります。
基本的な状況については、[stackoverflow] の質問 Python の辞書の基礎となるハッシュ データ構造に関するいくつかの回答を参照できます。
• 辞書の最小スペースは 8 エントリ (PyDict_MINSIZE) です。
• エントリ数が 50,000 未満の場合、毎回 4 倍に増加します。
• エントリ数が 50,000 を超える場合は、増加します。毎回 2 回;
• キーのハッシュ値は辞書にキャッシュされます。辞書はサイズ変更後に再計算されません。
辞書は 2/3 に近づくたびにサイズ変更されます。
上記の Python オブジェクトのメモリ使用量は、エディターによって共有されたすべての内容です。参考にしていただければ幸いです。また、PHP 中国語 Web サイトもサポートしていただければ幸いです。
Python オブジェクトのメモリ使用量に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。