概要
へぇーってなったので、忘れないうちにメモメモ。
超有名な Raymond Hettinger さんのツイートで知りました。
#Python oddity: While most functions with corresponding dunder methods are straight pass throughs, sys.getsizeof() adds on the size of GC fields:
— Raymond Hettinger (@raymondh) August 7, 2019
>>> len([10, 20]) == [10, 20].__len__()
True
>>> sys.getsizeof([10, 20]) == [10, 20].__sizeof__()
False
試してみる
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> l = [10, 20] >>> type(l) <class 'list'> >>> sys.getsizeof(l) 80 >>> sys.getsizeof([10,20]) 80 >>> l.__sizeof__() 56
本当だ・・・。GC用のフィールドが追加されている分 sys.getsizeof()
の方が多くなるんですねー。
同じ場合もあります。
>>> s = "helloworld" >>> sys.getsizeof(s) 59 >>> s.__sizeof__() 59 >>> >>> >>> i = 1_000_000_000 >>> sys.getsizeof(i) 28 >>> i.__sizeof__() 28
サンプル
""" sys.getsizeof() と __sizeof__() で 返される値が異なる時があるのを確認するサンプル REFERENCES:: http://bit.ly/2GTVkbs """ import sys from trypython.common.commoncls import SampleBase class Sample(SampleBase): def exec(self): # sys.getsizeof() は GC フィールドの分を加算するので # __sizeof__() が返す値と異なるときがある list_data = [10, 20] sys_sizeof = sys.getsizeof(list_data) dunder_sizeof = list_data.__sizeof__() self._print(type(list_data), sys_sizeof, dunder_sizeof) # 同じものもある str_data = "hello world" sys_sizeof = sys.getsizeof(str_data) dunder_sizeof = str_data.__sizeof__() self._print(type(str_data), sys_sizeof, dunder_sizeof) int_data = 1_000_000_000 sys_sizeof = sys.getsizeof(int_data) dunder_sizeof = int_data.__sizeof__() self._print(type(int_data), sys_sizeof, dunder_sizeof) # noinspection PyMethodMayBeStatic def _print(self, t: type, sys_sizeof: int, dunder_sizeof: int): print(f'{t}:\tsys.getsizeof: {sys_sizeof}\tdunder_sizeof: {dunder_sizeof}') def go(): obj = Sample() obj.exec()
以下実行結果。
[START] ==== trypython.stdlib.sys_.sys_getsizeof_vs_dunder_sizeof_diff ==== <class 'list'>: sys.getsizeof: 80 dunder_sizeof: 56 <class 'str'>: sys.getsizeof: 60 dunder_sizeof: 60 <class 'int'>: sys.getsizeof: 28 dunder_sizeof: 28 [END ] ==== trypython.stdlib.sys_.sys_getsizeof_vs_dunder_sizeof_diff ====
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場