TIM Labs

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

| コメント(0) | トラックバック(0)
どうやら、数もオブジェクトのようだ。 
ならば、そのオブジェクトのバイト数を調べることができるのでは。

ということで調べたら、 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バイトのようだ。
この不思議はどう考えればよいのだろうか。

トラックバック(0)

トラックバックURL: http://labs.timedia.co.jp/mt/mt-tb.cgi/537

コメントする

このブログ記事について

このページは、fujiが2016年12月 9日 00:00に書いたブログ記事です。

ひとつ前のブログ記事は「Python簡単実験:オブジェクトのIDの調査」です。

次のブログ記事は「Python簡単実験:長大なリストのメモリ消費量」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ