Выбор ответа Middle Память и производительность обновлено
__slots__ для миллионов объектов
Вопрос
Сервис держит в памяти 5 млн мелких объектов Point(x, y). Какое изменение класса заметнее всего уменьшит память?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Добавить slots = ("x", "y"). Без slots у каждого экземпляра есть свой dict, а это отдельный словарь.
Варианты ответа
- Добавить компактный
__repr__ - Сделать все методы статическими
- Наследоваться от
objectявно, без mixin - Добавить
__slots__ = ("x", "y")правильный ответ
Разбор
Без __slots__ у каждого экземпляра есть свой __dict__, а это отдельный словарь. Слоты хранят атрибуты в фиксированных ячейках, и экономия на миллионах объектов измеряется сотнями мегабайт. Ещё сильнее экономят массивы numpy или array, где числа лежат подряд без объектов. Методы и __repr__ хранятся в классе, а явное наследование от object в Python 3 ничего не меняет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Память и производительность»
- Встроенные функции против ручного цикла
- Пересечение больших списков id
- Числа Фибоначчи без экспоненты
- Скользящая медиана потока на двух кучах
- Найти пару с суммой быстрее O(n²)
- Циклические ссылки и gc
- Управление памятью в CPython
- Инструменты профилирования Python