«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Использование __slots__ для повышения производительности классов Python

Использование __slots__ для повышения производительности классов Python

Опубликовано 12 ноября 2024 г.
Просматривать:969

Каждый раз, когда мы создаем новый класс, Python сохраняет каждый атрибут в атрибуте dict, который называется динамическим словарем. Такое поведение по умолчанию кажется удобным, поскольку оно гибкое, но когда вы работаете с большим количеством экземпляров или использование памяти имеет большое значение, эти накладные расходы могут быть значительными.

Leveraging __slots__ for Better Performance in Python Classes

Как работают «слоты»?

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

import sys 

class WithoutSlots:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class WithSlots:
    __slots__ = ['x', 'y']

    def __init__(self, x, y):
        self.x = x
        self.y = y

obj1 = WithoutSlots(1, 2)
obj2 = WithSlots(1, 2)

print(sys.getsizeof(obj1.__dict__)) # 296
print(sys.getsizeof(obj2)) # 48

Как показано выше, «WithoutSlots» использует гораздо больше памяти по сравнению с «WithSlots». Подумайте о создании множества экземпляров класса. Какой подход будет лучшим выбором?

Leveraging __slots__ for Better Performance in Python Classes

Ограничения

слоты может быть полезным инструментом, но имеет ограничения:

  • Нет динамических атрибутов: при определении слотов в теле класса мы отключаем его атрибут по умолчанию (dict), поэтому мы не можем динамически добавлять новые атрибуты к экземпляру после его создания.
obj = WithSlots(1, 2)
obj.z = 3  # This will raise an AttributeError

Мы можем обойти эту проблему, добавив dict в слот .

  • Нет множественного наследования: каждый базовый класс должен содержать определенные слоты, иначе Python вернется к использованию словаря для хранения атрибутов экземпляра.

  • Нет значения по умолчанию: вам необходимо явно инициализировать значения по умолчанию в методе init.

Leveraging __slots__ for Better Performance in Python Classes

Когда его использовать

Я записал несколько лучших примеров сценариев, в которых мы можем использовать слоты:

  • Когда нам нужно создать много экземпляров и использование памяти вызывает беспокойство.
  • Когда нам нужно оптимизировать производительность.
  • Когда у вас есть известные и фиксированные атрибуты.
  • Когда вы работаете с большими наборами данных.

Leveraging __slots__ for Better Performance in Python Classes

Заключительные мысли

Вот как в Python используются слоты: вы можете использовать их, если уверены, что для вашего класса не потребуются никакие другие атрибуты и вы работаете с ними. большое количество экземпляров. Определяя slots, вы указываете Python использовать более эффективную и компактную структуру для хранения атрибутов, что помогает экономить память. Это особенно удобно, когда использование памяти является проблемой или когда вам нужно оптимизировать производительность. Просто помните, что с помощью slots вы не можете добавлять новые атрибуты динамически, поэтому его лучше всего использовать, когда атрибуты вашего класса фиксированы и четко определены.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/conradylx/leveraging-slots-for-better- Performance-in-python-classes-2ol4?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить это
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3