Что такое __slots__ и когда его использовать?
- Как уменьшить память под миллион объектов в Python?
__slots__ = ("x", "y") заменяет у экземпляров словарь __dict__ на фиксированные ячейки: объект занимает в несколько раз меньше памяти, доступ к атрибутам чуть быстрее, а добавить новый атрибут нельзя (AttributeError).
- Выигрыш заметен на миллионах мелких объектов
- Наследники без своих __slots__ снова получают __dict__
- Для weakref нужно добавить '__weakref__' в слоты
А ещё @dataclass(slots=True) с Python 3.10 генерирует слоты сам
Подробно
Без слотов каждый экземпляр хранит атрибуты в своём словаре — гибко, но словарь на каждый объект стоит сотни байт.
class Point:
__slots__ = ("x", "y")
def __init__(self, x, y):
self.x, self.y = x, y
p = Point(1, 2)
p.z = 3 # AttributeError
Слоты реализованы дескрипторами на уровне класса: каждый атрибут — ячейка фиксированного смещения в объекте.
Ограничения:
- нельзя добавлять атрибуты, не перечисленные в слотах;
- множественное наследование от двух классов с непустыми слотами невозможно;
- значения по умолчанию через атрибуты класса конфликтуют со слотами;
- pickle и копирование работают, но старые библиотеки, ожидающие
__dict__, могут сломаться.
Когда применять: много мелких объектов (точки, узлы графа, записи из парсера). Для обычных бизнес-объектов выигрыш не нужен.
Что хотят услышать
- Что заменяют слоты и выигрыш в памяти.
- Ограничения.
- dataclass(slots=True).
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Ускоряет добавление любых новых атрибутов, а наследники получают __slots__ без __dict__
- ✓Ячейки вместо __dict__: меньше памяти, новых атрибутов не добавить
- ✗__slots__ увеличивает память объекта, зато ускоряет доступ к любым атрибутам
- ✗__slots__ работает только в классах, объявленных через @dataclass(slots=True)
Разбор темы
- Модель данных — создание объектов, атрибуты и дескрипторы
__new__ и __init__, согласование __eq__ и __hash__, __getattr__ и __getattribute__, дескрипторы и __slots__.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.