Python の sys.getsizeof() 関数がでオブジェクトのメモリの割り当ての大きさを調べる2022年04月08日 12時30分23秒

Python には sys.getsizeof() 関数があり、目的のオブジェクトの直接のメモリの割り当ての大きさを調べることが出来る。

これは、C 言語や C++ の sizeof() と同等。sizeof で struct や class を計ると、直接割り当てられているプリミティブ型は数えられるが、ポインタ型や独自にメモリを割り当てる string 型などだと、別途割り当てられるメモリの大きさは含まれないの。

dict 型の sys.getsizeof() をすると、dict が保持する構造体部分のメモリの割り当てを調べることは出来るが、key や value として、割り当てられているメモリは勘定には入らない。その為、dict 全部での割り当てを調べるには、独自に key と value に割り当てられているメモリも合計する必要がある。

実演。

% python         
Python 3.8.12 (default, Nov  4 2021, 01:18:05) 
<<< import sys
<<< sys.getsizeof("abc")
28
<<< sys.getsizeof("abcde")
30
文字列型は二文字増えたら二バイト増えた。この計算でいくと、文字列型は最低 25 バイト消費する。
<<< d = {}
<<< sys.getsizeof(d)
36
<<< sys.getsizeof({})
36
dict を直接渡しても、変数で渡しても同じ大きさ。dict は最低 36 バイトの様だ。
<<< sys.getsizeof({"abc":"abc"})
124
<<< sys.getsizeof({"abc":"abc", "def":"def"})
124
dict に幾つか値を入れたら、124 バイトになった。
<<< sys.getsizeof(1)
14
<<< sys.getsizeof(1.0)
16
<<< sys.getsizeof(999)
14
<<< sys.getsizeof(b'1')
18
整数型、浮動小数点型、バイト型はそれぞれ大きさが違うようだ。
<<< sys.getsizeof({1:{}})
124
<<< sys.getsizeof({1:{1:{}}})
124
<<< sys.getsizeof({1:{1:{1:{}}}})
124
<<< sys.getsizeof({1:{1:{1:{1:{}}}}})
124
<<< sys.getsizeof({1:{1:{1:{1:{1:{}}}}}})
124
<<< sys.getsizeof({"abc":{}})
124
sys.getsizeof() は再帰的には大きさを取得しないので、どれだけ深くしても一番上が消費するメモリの大きさは一緒。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2022/04/08/9479734/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。