Python簡単実験:摩訶不思議なオブジェクトのバイト数


2016年 12月 09日

どうやら、数もオブジェクトのようだ。 
ならば、そのオブジェクトのバイト数を調べることができるのでは。

ということで調べたら、 sys ライブラリの中に getsizeof(オブジェクト) が用意されていたので、1のサイズを求めてみた。

In [1]: import sys

In [2]: sys.getsizeof(1)
Out[2]: 28
しかし、結果は28バイト。なんだかやらたに大きい。

In [67]: for obj in [[],[1],[1,2],(),(1,2),{},{1},{1,2},{'a':1},{'a':1,'b':2}]:
....:     print(sys.getsizeof(obj),'\t',obj)
....:
64 	 []
72 	 [1]
80 	 [1, 2]
48 	 ()
64 	 (1, 2)
288 	 {}
224 	 {1}
224 	 {1, 2}
288 	 {'a': 1}
288 	 {'a': 1, 'b': 2}
どうやら、数字を1つ増やすごとに8バイト増えるようだ。 空リストは64バイト、空タプルは48バイト、{}は空集合ではなく、空辞書になるようだ。 そして、集合や辞書は、要素数に比例して大きくなるのではなく、たぶん階段状に増えていくものと予想される。

Pythonでは何でもオブジェクトになり、オブジェクトは単にデータが入っているだけではなく色々な物、仕掛けを隠し持っていて、そのためにサイズが増えているようだ。仕掛けの中には、ガーベッジコレクションも含まれているはずだ。

ここまでは、何でもオブジェクトにしたためと思われるので納得できる。

次に、文字列について調べた。
In [70]: for obj in ['','a','ab','abcdefghi','漢','漢字','?','+','+-*/']:
....:     print(sys.getsizeof(obj),'\t',obj)
....:
49
58      a
51      ab
58      abcdefghi
76      漢
78      漢字
50      ?
50      +
53      +-*/
‘a’は58バイト、’ab’は51バイト。
同じ1文字でも、アルファベットは58バイトで、記号は50バイトのようだ。
この不思議はどう考えればよいのだろうか。