Comprender las tragamonedas en Python

Comprender las tragamonedas en Python

La creación de objetos para clases requiere memoria y el atributo almacenado tiene la forma de un diccionario. Tomará mucha memoria y tiempo de indexación si necesitamos asignar miles de objetos.

Slots o __slots__ proporciona un mecanismo único para reducir el tamaño de los objetos y una indexación más rápida. Este artículo discutirá cómo funciona la variable constante de tragamonedas en Python y cómo es mejor que usar diccionarios.

Comprender las tragamonedas en Python

Slots es un concepto de optimización de memoria en objetos que mejoraría el tiempo de ejecución de nuestro código Python. Por ejemplo, cuando creamos un objeto personalizado a partir de una clase, los atributos del objeto almacenado en un diccionario se denominan __dict__.

Además, nos permite crear nuevos atributos tras la creación del objeto de forma dinámica.

Sin ranuras, nuestros objetos se verían como el siguiente fragmento de código a continuación.

Código de ejemplo:

class sample_class(object):
    def __init__(self, *args, **kwargs):
        self.key = "foo"
        self.value = "bar"


if __name__ == "__main__":
    sample_object = sample_class()
    print(sample_object.__dict__)

Producción :

{'key': 'foo', 'value': 'bar'}

En Python, cada objeto tiene un diccionario dinámico que admite agregar atributos. Tendremos una instancia de diccionario para cada objeto de instancia, ocupando espacio adicional y desperdiciando mucha RAM.

Al crear un objeto en Python, no existe una funcionalidad predeterminada para asignar una cantidad determinada de memoria para almacenar todas sus características.

Utilizando __slots__, que asignan espacio para un número determinado de atributos, reduce el desperdicio de espacio y acelera el programa.

Código de ejemplo:

class sample_class(object):
    __slots__ = ["key", "value"]

    def __init__(self, *args, **kwargs):
        self.key = "foo"
        self.value = "bar"


if __name__ == "__main__":
    sample_object = sample_class()
    print(sample_object.__slots__)

Producción :

['key','value']

Tenga en cuenta que al llamar a la variable __slots__, solo accedemos a las claves para mapear cada valor en un diccionario. Aunque el diccionario de Python es increíblemente intuitivo, puede haber problemas si intentamos crear miles o millones de elementos simultáneamente.

  1. El diccionario necesita memoria. Millones de objetos consumirán el uso de RAM.
  2. El diccionario es, de hecho, un mapa hash.

Por lo tanto, es posible que la diferencia de tiempo de ejecución entre el diccionario y las ranuras no se note con algunos atributos, pero a medida que los datos aumentan, nos alegraremos de haber usado ranuras. Aproximadamente podemos ahorrar un 10% del tiempo de ejecución al acceder a los atributos.

Código de ejemplo:

import timeit


class sample_class(object):
    def __init__(self, *args, **kwargs):
        self.key = "foo"
        self.value = "bar"


class sample_class_slots(object):
    __slots__ = ["key", "value"]

    def __init__(self, *args, **kwargs):
        self.key = "foo"
        self.value = "bar"


if __name__ == "__main__":

    time = timeit.timeit("t.key", "from __main__ import sample_class; t=sample_class()")
    time_slots = timeit.timeit(
        "t.key", "from __main__ import sample_class_slots; t=sample_class_slots()"
    )

    print("Time without Slots: ", time)
    print("Time with Slots: ", time_slots)

Producción :

Time without Slots:  0.0202741
Time with Slots:  0.0200698
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn