Funciones de Python – cached_property()

@cached_property es un decorador que transforma un método de una clase en una propiedad cuyo valor se calcula solo una vez y luego se almacena en caché como un atributo normal. Por lo tanto, el resultado almacenado en caché estará disponible siempre que la instancia persista y podamos usar ese método como un atributo de una clase, es decir

Writing    : instance.method
Instead of : instance.method()

cached_property es parte del módulo functools en Python. Es similar a property(), pero cached_property() viene con una función adicional y es el almacenamiento en caché.

Nota: Para obtener más información, consulte el módulo Functools en Python

¿Por qué almacenamiento en caché?

La memoria caché es una memoria de alta velocidad disponible dentro de la CPU para acelerar el acceso a datos e instrucciones. Por lo tanto, el caché es un lugar de rápido acceso. El resultado se puede calcular y almacenar una vez y, a partir de la próxima vez, se puede acceder al resultado sin tener que volver a calcularlo. Por lo tanto, es útil en caso de cálculos costosos.

Diferencia entre @property y @cached_property:

# Using @property
  
# A sample class
class Sample():
  
    def __init__(self):
      self.result = 50
  
    @property
    # a method to increase the value of
    # result by 50
    def increase(self):
        self.result = self.result + 50
        return self.result
  
# obj is an instance of the class sample
obj = Sample()
print(obj.increase)
print(obj.increase)
print(obj.increase)

PRODUCCIÓN

100
150
200

El mismo código pero ahora usamos @cached_property en lugar de @property

# Using @cached_property
  
from functools import cached_property
  
# A sample class
class Sample():
  
    def __init__(self):
      self.result = 50
  
    @cached_property
    # a method to increase the value of
    # result by 50
    def increase(self):
        self.result = self.result + 50
        return self.result
  
# obj is an instance of the class sample
obj = Sample()
print(obj.increase)
print(obj.increase)
print(obj.increase)

PRODUCCIÓN

100
100
100

Puede ver claramente que con @property el valor del resultado se calcula cada vez que se llama al método de aumento(), por eso su valor aumenta en 50. Pero con @cached_property, el valor del resultado se calcula solo una vez y luego se almacena en el caché, para que se pueda acceder a él cada vez que se llama al método de aumento() sin volver a calcular el valor del resultado, y es por eso que la salida muestra 100 cada vez.

Pero, ¿cómo reduce el tiempo de ejecución y hace que el programa sea más rápido?
Considere el siguiente ejemplo:

# Without using @cached_property
  
# A sample class
class Sample():
  
    def __init__(self, lst):
      self.long_list = lst
  
    # a method to find the sum of the 
    # given long list of integer values
    def find_sum(self):
        return (sum(self.long_list))
  
# obj is an instance of the class sample
# the list can be longer, this is just
# an example
obj = Sample([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(obj.find_sum())
print(obj.find_sum())
print(obj.find_sum())

PRODUCCIÓN

55
55
55

Aquí, supongamos que pasamos una larga lista de valores, la suma de la lista dada se calculará cada vez find_sum()que se llame al método, lo que llevará mucho tiempo para la ejecución y, en última instancia, nuestro programa se volverá lento. Lo que queremos es que, dado que la lista no cambia después de la creación de la instancia, sería bueno que la suma de la lista se calculara solo una vez y no cada vez que llamamos al método y deseamos acceder a la suma. Esto se puede lograr usando @cached_property

Ejemplo:

# With using @cached_property
  
from functools import cached_property
  
# A sample class
class Sample():
    def __init__(self, lst):
      self.long_list = lst
  
    # a method to find the sum of the
    # given long list of integer values
    @cached_property
    def find_sum(self):
        return (sum(self.long_list))
  
# obj is an instance of the class sample
obj = Sample([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(obj.find_sum)
print(obj.find_sum)
print(obj.find_sum)

PRODUCCIÓN

55
55
55

Aunque el resultado es el mismo, reduce mucho el tiempo de ejecución. La suma de la lista que se pasa en el momento de la creación de la instancia se calcula solo una vez y se almacena en la memoria caché y, a partir de entonces, utiliza el mismo valor ya calculado de la suma cada vez que llamamos al método find_sum() y nos ahorra costosos recálculos de la suma. Por lo tanto, reduce el tiempo de ejecución y hace que nuestro programa sea más rápido.

Publicación traducida automáticamente

Artículo escrito por shubhamkumarlhh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *