Как определить, сколько памяти использует объект в Python?

Нет простого способа узнать размер объекта Python в памяти, можно только приблизительно подсчитать.

  1. Если иметь в виду простые объекты (например, int, string, float, double), которые представлены как элементарные типы данных языка Си, то количество байтов можно примерно подсчитать с помощью скрипта Джона Малдера:

    def sizeof(obj):
        """APPROXIMATE memory taken by some Python objects in 
        the current 32-bit CPython implementation.
    
        Excludes the space used by items in containers; does not
        take into account overhead of memory allocation from the
        operating system, or over-allocation by lists and dicts.
        """
        T = type(obj)
        if T is int:
            kind = "fixed"
            container = False
            size = 4
        elif T is list or T is tuple:
            kind = "variable"
            container = True
            size = 4 * len(obj)
        elif T is dict:
            kind = "variable"
            container = True
            size = 144
            if len(obj) > 8:
                size += 12 * (len(obj) - 8)
        elif T is str:
            kind = "variable"
            container = False
            size = len(obj) + 1
        else:
            raise TypeError("don't know about this kind of object")
        if kind == "fixed":
            overhead = 8
        else:  # "variable"
            overhead = 12
        if container:
            garbage_collector = 8
        else:
            garbage_collector = 0
        malloc = 8  # in most cases
        size = size + overhead + garbage_collector + malloc
        # Round to nearest multiple of 8 bytes
        x = size % 8
        if x != 0:
            size += 8 - x
            size = (size + 8)
        return size
    
  2. Более сложные объекты можно попробовать сериализовать в строку с помощью pickle.dumps. Длина этой строки — примерный объем памяти, необходимый для хранения объекта. С этим вариантом проблема: объекты обычно содержат ссылки на другие объекты. Например, список или словарь может иметь ссылки на какие-нибудь сложные классы. Эти классы могут находиться в разных местах. Поскольку pickle всегда пытается выполнить полную сериализацию объекта, он всегда будет излишне оценивать объем памяти, необходимый для хранения объекта.

  3. Наиболее универсальный вариант — рецепт с сайта ActiveState, с его помощью можно приблизительно оценить объем памяти, занимаемый почти любым объектом Python.