Выбор ответа Middle Память и производительность обновлено

__slots__ для миллионов объектов

Вопрос

Сервис держит в памяти 5 млн мелких объектов Point(x, y). Какое изменение класса заметнее всего уменьшит память?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Добавить slots = ("x", "y"). Без slots у каждого экземпляра есть свой dict, а это отдельный словарь.

Варианты ответа

  1. Добавить компактный __repr__
  2. Сделать все методы статическими
  3. Наследоваться от object явно, без mixin
  4. Добавить __slots__ = ("x", "y")правильный ответ

Разбор

Без __slots__ у каждого экземпляра есть свой __dict__, а это отдельный словарь. Слоты хранят атрибуты в фиксированных ячейках, и экономия на миллионах объектов измеряется сотнями мегабайт. Ещё сильнее экономят массивы numpy или array, где числа лежат подряд без объектов. Методы и __repr__ хранятся в классе, а явное наследование от object в Python 3 ничего не меняет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.