Комментарии 11
В примерах явно потерялись двойные подчеркивания.
а что это за версия питона? Ато у меня AttributeError: 'NoSlots' object has no attribute 'dict'
Очень неплохое видео про оптимизации производительности Питона, про слоты там тоже есть.
https://www.youtube.com/watch?v=Ix04KpZiUA8
Когда мы создаем объекты для классов, требуется память, а атрибут хранится в виде словаря (в dict). В случае, если нам нужно выделить тысячи объектов, это займет достаточно много места в памяти.
В современном Python 3 это неправда уже лет десять, с момента как стали шарить ключи словарей PEP-412
Сегодня использование слотов не имеет особого практического смысла. Даже если у вас получится выиграть пару лишних мегабайт памяти или миллисекунд на обращение к атрибутам, по отношению к полезной нагрузке от тысяч объектов это будет незначительно.
Если у вас полезной нагрузки нет, реально число-дробилка на десятки тысяч объектов и важна производительность, попробуйте “data-driven" подход. Более оптимальные структуры вроде кортежей или условных массивов numpy дадут больше профита, чем "оптимизация" объектов.
А как слоты пересекаются с датаклассами?
Пересекаются. Плохо только, что до этого сразу не додумались, а только в 3.10 -- ИМХО очевиднейшая вещь
Ну и под конец важные выводы:
В этом пункте куда-то пропали нижние подчёркивания. Особенно это сбивает с толку когда смотришь на class
, а должно быть __class__
Атрибут
slots
не работает для классов, наследованных, от встроенных типов переменной длины, таких какint
,bytes
иtuple
.
Вообще-то пустой __slots__
будет работать:
class A(int): __slots__ = ()
Видимо, при копировании с документации, вы забыли слово Nonempty.
Ну и под конец важные выводы:
Атрибут
slots
не работает для классов, наследованных, от встроенных типов переменной длины, таких какint
,bytes
иtuple
.
Вывод подводит итог того, о чём до этого говорилось. Что-то не найду момента в статье (до вывода), где говорилось бы про наследование класса от встроенных типов переменной длины. Если уж копируете с документации, то так и пишите «Примечания по использованию слотов» («Notes on using slots»)
Сплошной копипаст с этой статьи 19 года
Использование slots | Python