ホームページ  >  記事  >  バックエンド開発  >  Python オブジェクトのメモリ使用量

Python オブジェクトのメモリ使用量

高洛峰
高洛峰オリジナル
2017-02-28 16:48:531753ブラウズ

すべてはオブジェクトです

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 サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。