Python обладает широкими динамическими возможностями. Строгая динамическая неявная типизация позволяет не указывать типы, но при этом не бояться что в коде просуммируем строку и число. Однако за динамичность приходиться платить - памятью и скоростью.

Но что если хочется максимально уменьшить размер объектов (а в python все объекты) и при этом не потерять в функциональности? Для примера возьмем плоскость. На плоскости, пускай, надо разместить миллион точек (что не так много). При этом надо иметь возможность красить точку в разные цвета, расстояния подсчитывать и прочие действия.

Иными словами:

Надо иметь возможность создать миллион пар (x, y) + несколько методов для работы с ними. И требуется занять минимальное количество памяти.

Можно пойти по процедурному пути, сделать массив, отдельные функции для обработки точек. Но сделаем все в виде класса. Методы расписывать не буду, а вот побороться за минимальное потребление памяти стоит. В простом варианте можно написать код:

class Test1(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b

class Test2(object):
    __slots__ = ('a', 'b')
    def __init__(self, a, b):
        self.a = a
        self.b = b

Можно заметить, что код почти одинаковый. Есть только какое-то магическое имя __slots__. Именно оно и позволит уменьшить потребление памяти. Но перед тем как сказать сколько памяти было сэкономлено, расскажу про __slots__

__slots__ - одно из магических имен в Python. Наличие __slots__ ограничивает возможные имена атрибутов объекта теми, которые там указаны. В примере в слотах указаны a и b. Если вызвать переменную "c", то получим исключение. Тем самым можно явно ограничивать расширение функционала объектов в runtime.

Такое явно ограничение количества переменных позволяет экономить память. Для примера, если создать миллион объектов Test1 и Test2, то во втором случае получим экономию памяти в 5 раз (подтверждение этому можно найти по первой ссылке, там рассматривается Python2)

Почему эта экономия существует и почему так, смотри по ссылкам:



Комментарии