Hace unos años, escribí una publicación de blog sobre cómo escribir bucles eficientes en memoria en Python que se volvió bastante popular. La respuesta positiva me animó a escribir una segunda parte, donde profundizo en métodos adicionales de optimización de la memoria.
Al escribir código Python, los bucles no son el único lugar donde debemos tener en cuenta el uso de la memoria. En proyectos relacionados con datos y desarrollo de código orientado a objetos, es importante asegurarse de que nuestras clases también sean eficientes en memoria. A menudo, invertimos una cantidad significativa de tiempo diseñando y escribiendo clases complejas e intrincadas, sólo para descubrir que su rendimiento es deficiente en las pruebas o en la producción debido a la gran cantidad de datos que necesitan transportar.
Si sigue las técnicas y enfoques analizados en el artículo, puede crear clases que optimicen el uso de la memoria y mejoren el rendimiento general. Esta publicación de blog explora tres técnicas y enfoques recomendados para crear clases de Python con uso eficiente de la memoria.
Usando Python __slots__ Dunder, puedes definir explícitamente los atributos que una clase puede poseer. Esto generalmente ayuda a optimizar el uso de memoria de nuestras clases al evitar la creación de un diccionario dinámico para el almacenamiento de atributos.
De forma predeterminada, las clases de Python almacenan sus atributos de instancia en un diccionario privado (__dict__). Este diccionario permite mucha flexibilidad, ya que puede agregar, modificar o eliminar los atributos de clase en tiempo de ejecución. Sin embargo, esta flexibilidad suele tener como coste una sobrecarga de memoria. Cada instancia de la clase tiene un diccionario que almacena nombres y valores de atributos como pares clave-valor. Cuando usas __slots__Python reserva solo una cantidad fija de espacio para los atributos especificados directamente en cada instancia, en lugar de usar el diccionario predeterminado.
Aquí hay un ejemplo de una clase de Python que usa __slots__ para aumentar la eficiencia de la memoria: