すべてはオブジェクトです
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 モジュールに提供します。
もちろん、オブジェクトのメモリ使用量は Python のバージョンとオペレーティング システムのバージョンに密接に関係しています。この記事のコードとテスト結果は Windows7 32 ビット オペレーティング システムに基づいています。
import sys print sys.version
<font color="#000000" face="NSimsun">2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32 bit (Intel)]</font>
基本的なタイプ
•ブール値
print 'True のサイズ: %d' % (sys.getsizeof(True)) print 'False のサイズ: %d' % (sys.getsizeof(False))
出力:
真のサイズ: 12 偽のサイズ: 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))
出力:
フロートのサイズ: 16
浮動小数点型は 16 バイトを占有します。一定の精度を超える場合は四捨五入されます。
次のコードを参照してください:
印刷 1.00000000003 印刷 1.000000000005
出力:
1.00000000003 1.00000000001
•文字列
# 文字列型のサイズ print 'rn'.join(["size of string with %d chars: %d" % (len(elem), sys.getsizeof(elem)) for elem in ["", "a" , "ab"]]) # Unicode 文字列のサイズ print 'rn'.join(["%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 バイトを占有します。
コレクションタイプ
•リスト
# リスト型のサイズ 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 '%d 整数のリスト サイズ: %d, total_size: %d' % (i, getsizeof(li), total_size(li)) li.append(私)•タプル
基本的にはリストと似ていますが、少なくとも 28 バイト必要です。
•辞書
もちろん、辞書の状況は比較的複雑です。詳細については、コード dictobject.c を参照してください。また、辞書の最適化に関する注意事項も注意深く読む価値があります。
基本的な状況については、[stackoverflow] の質問 Python の辞書の基礎となるハッシュ データ構造に関するいくつかの回答を参照できます。
•辞書の最小スペースは 8 エントリ (PyDict_MINSIZE) です。
•エントリー数が50,000件未満の場合、毎回4倍に増加します
•エントリー数が50,000を超える場合、毎回2倍に増加します;
•キーのハッシュ値は辞書にキャッシュされ、辞書のサイズが変更された後は再計算されません。
Python オブジェクトのメモリ使用量について簡単に説明した上記の記事は、エディターによって共有されたすべての内容です。参考にしていただければ幸いです。また、Script Home をサポートしていただければ幸いです。