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.
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?
slots puede ser una herramienta útil, pero tiene limitaciones:
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.
He escrito algunos de los mejores ejemplos de escenarios en los que podemos usar slots:
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.
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