Python でオブジェクトの正確なメモリ使用量を特定するのは難しいと読んだことを思い出します。ただし、そのスレッドは 2009 年のものであり、それ以来、Python のさまざまなメモリ プロファイラーについて読んできました (このスレッドの例を参照してください)。また、IPython はここ数か月で大幅に成熟しました (バージョン 1.0 は数日前にリリースされました)。
IPython には whos
、変数名、その型、およびいくつかの基本的なデータ/情報を出力する というマジックが既にあります。
同様に、によって返される各オブジェクトのメモリ内のサイズを取得する方法はありますwho
か? この目的のために既に IPython で利用できるユーティリティはありますか?
グッピーを使う
Guppy (このスレッド で推奨) には、オブジェクト タイプごとの累積メモリ使用量を取得できるコマンドがありますが、残念ながら:
- オブジェクトごとのメモリ使用量は表示されません
- サイズをバイト単位で出力します(人間が読める形式ではありません)
2 つ目については、この回答bytes2human
から適用できる可能性がありますが、最初に解析可能な形式で出力を収集する必要があります。h.heap()
しかし、最初のもの (最も重要なもの) について、Guppy にオブジェクトごとのメモリ使用量を表示させる方法はありますか?
In [6]: import guppy
In [7]: h = guppy.hpy()
In [8]: h.heap()
Out[8]:
Partition of a set of 2871824 objects. Total size = 359064216 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 522453 18 151469304 42 151469304 42 dict (no owner)
1 451503 16 36120240 10 187589544 52 numpy.ndarray
2 425700 15 34056000 9 221645544 62 sklearn.grid_search._CVScoreTuple
3 193439 7 26904688 7 248550232 69 unicode
4 191061 7 22696072 6 271246304 76 str
5 751128 26 18027072 5 289273376 81 numpy.float64
6 31160 1 12235584 3 301508960 84 list
7 106035 4 9441640 3 310950600 87 tuple
8 3300 0 7260000 2 318210600 89 dict of 0xb8670d0
9 1255 0 3788968 1 321999568 90 dict of module
<1716 more rows. Type e.g. '_.more' to view.>