いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Pythonメモ-108 (sys.getsizeof()と__sizeof__()が返す値が異なる時がある)

概要

へぇーってなったので、忘れないうちにメモメモ。

超有名な Raymond Hettinger さんのツイートで知りました。

試してみる

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 ====

過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com