"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Aprovechando __slots__ para un mejor rendimiento en las clases de Python

Aprovechando __slots__ para un mejor rendimiento en las clases de Python

Publicado el 2024-11-12
Navegar:499

Cada vez que creamos una nueva clase, Python almacena cada atributo en un atributo dict que se denomina diccionario dinámico. Este comportamiento predeterminado parece conveniente porque es flexible, pero cuando se trabaja con una gran cantidad de instancias o el uso de la memoria es importante, esta sobrecarga puede ser significativa.

Leveraging __slots__ for Better Performance in Python Classes

¿Cómo funcionan las 'ranuras'?

Python básicamente usa un diccionario para almacenar atributos de clase, pero una de las alternativas es usar ranuras. Al definir este nombre, le estamos diciendo a Python que utilice una estructura más estática y compacta que reduce significativamente el uso de memoria. A continuación se muestra un ejemplo básico de cómo utilizar espacios en una clase.

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

Como se muestra arriba, 'WithoutSlots' usa mucha más memoria en comparación con 'WithSlots'. Piense en crear muchas instancias de la clase. ¿Qué enfoque sería la mejor opción?

Leveraging __slots__ for Better Performance in Python Classes

Limitaciones

slots puede ser una herramienta útil, pero tiene limitaciones:

  • Sin atributos dinámicos: al definir espacios en el cuerpo de la clase, deshabilitamos su atributo predeterminado (dict), por lo que no podemos agregar dinámicamente nuevos atributos a la instancia después de su creación.
obj = WithSlots(1, 2)
obj.z = 3  # This will raise an AttributeError

Podemos solucionar esto agregando dict a la ranura .

  • Sin herencia múltiple: cada clase base debe contener ranuras definidas; de lo contrario, Python volverá a usar el diccionario para almacenar los atributos de la instancia.

  • Sin valor predeterminado: Debe inicializar explícitamente los valores predeterminados explícitamente en el método init.

Leveraging __slots__ for Better Performance in Python Classes

Cuando usarlo

He escrito algunos de los mejores ejemplos de escenarios en los que podemos usar slots:

  • Cuando tenemos muchas instancias para crear y el uso de memoria es una preocupación.
  • Cuando necesitamos optimizar el rendimiento.
  • Cuando tienes atributos conocidos y fijos.
  • Cuando trabajas con grandes conjuntos de datos.

Leveraging __slots__ for Better Performance in Python Classes

Pensamientos finales

Así es como se usan slots en Python: puedes usarlos cuando estés seguro de que no necesitarás ningún otro atributo para tu clase y estás trabajando con una gran cantidad de instancias. Al definir ranuras, le indica a Python que utilice una estructura más eficiente y compacta para almacenar atributos, lo que ayuda a ahorrar memoria. Esto es especialmente útil cuando el uso de la memoria es un problema o cuando necesita optimizar el rendimiento. Solo recuerda que con ranuras, no puedes agregar nuevos atributos dinámicamente, por lo que es mejor usarlos cuando los atributos de tu clase son fijos y están bien definidos.

Declaración de liberación Este artículo se reproduce en: https://dev.to/conradylx/leveraging-slots-for-better-performance-in-python-classes-2ol4?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla. él
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3