Módulo Cachetools en Python

Cachetools es un módulo de Python que proporciona varias colecciones de memorización y decoradores. También incluye variantes del decorador @lru_cache de functools. Para usarlo, primero, necesitamos instalarlo usando pip.

pip install cachetools

Cachetools nos proporciona cinco funciones principales.

  • en caché
  • LRUCache
  • TTLCache
  • LFUCache
  • RRCache

Veamos cada una de las siguientes funciones en detalle y con ejemplos.

en caché

cached se utiliza como decorador. Cuando llamamos al caché, almacenará en caché la función para su uso posterior. De forma predeterminada, esto realizará una caché simple.

Sintaxis:

@cached(cache = {})
def some_fun():
    pass

Ejemplo: Veámoslo con un ejemplo. Vamos a usar el módulo de tiempo para ver la eficiencia de nuestro módulo.

from cachetools import cached
import time
  
  
# Without cached
def fib(n):
    return n if n<2 else fib(n-1) + fib(n-2)
  
s = time.time()
print(old_fib(35))
print("Time Taken: ", time.time() - s)
  
# Now using cached
s = time.time()
  
# Use this decorator to enable caching
@cached(cache ={})
def fib(n):
    return n if n<2 else fib(n-1) + fib(n-2)
  
print(fib(35))
print("Time Taken(cached): ", time.time() - s)

Producción:

9227465
Time Taken:  4.553245782852173
9227465
Time Taken(cached):  0.0003821849822998047

LRUCache

LRUCache se usa dentro del decorador almacenado en caché. Caché LRU significa caché «Usado menos recientemente». Toma un parámetro «maxsize» que establece cómo se deben almacenar en caché las funciones recientes.

Sintaxis:

@cached(cache= LRUCache(maxsize= 3))
def some_fun():
    pass

Ejemplo:

from cachetools import cached, LRUCache
import time
  
  
# cache using LRUCache
@cached(cache = LRUCache(maxsize = 3))
def myfun(n):
      
    # This delay resembles some task
    s = time.time()
    time.sleep(n)
    print("\nTime Taken: ", time.time() - s)
    return (f"I am executed: {n}")
  
  
# Takes 3 seconds
print(myfun(3))
  
# Takes no time
print(myfun(3))
  
# Takes 2 seconds
print(myfun(2))
  
# Takes 1 second
print(myfun(1))
  
# Takes 4 seconds
print(myfun(4))
  
# Takes no time
print(myfun(1))
  
# Takes 3 seconds because maxsize = 3 
# and the 3 recent used functions had 1,
# 2 and 4.
print(myfun(3))

Producción:

Time Taken:  3.0030977725982666
I am executed: 3
I am executed: 3

Time Taken:  2.002072334289551
I am executed: 2

Time Taken:  1.001115083694458
I am executed: 1

Time Taken:  4.001702070236206
I am executed: 4
I am executed: 1

Time Taken:  3.0030171871185303
I am executed: 3

Nota: LRUCache también se puede llamar desde el paquete estándar de Python: functools. Puede verse importado como

from functools import lru_cache
@lru_cache
def myfunc():
    pass

TTLCache

El caché TTLCache o “Time To Live” es la tercera función que se incluye en el módulo cachetools. Toma dos parámetros: «maxsize» y «TTL». El uso de «maxsize» es el mismo que el de LRUCache, pero aquí el valor de «TTL» indica cuánto tiempo se debe almacenar la memoria caché. El valor es en segundos.

Sintaxis:

@cached(cache= TTLCache(maxsize= 33, ttl = 600))
def some_fun():
    pass

Ejemplo:

from cachetools import cached, TTLCache
import time
  
# Here recent 32 functions 
# will we stored for 1 minutes
@cached(cache = TTLCache(maxsize = 32, ttl = 60))        
def myfun(n):
      
    # This delay resembles some task
    s = time.time()
    time.sleep(n)
    print("\nTime Taken: ", time.time() - s)
    return (f"I am executed: {n}")
  
print(myfun(3))
print(myfun(3))
time.sleep(61)
print(myfun(3))

Producción:

Time Taken:  3.0031025409698486
I am executed: 3
I am executed: 3

Time Taken:  3.0029332637786865
I am executed: 3

LFUCache

LFUCache o caché de «Uso menos frecuente» es otro tipo de técnica de almacenamiento en caché que recupera la frecuencia con la que se llama a un elemento. Descarta los elementos que se llaman con menos frecuencia para hacer espacio cuando sea necesario. Toma un parámetro: «maxsize», que es el mismo que en LRUCache.

Sintaxis:

@cached(cache= LFUCache(maxsize= 33))
def some_fun():
    pass

Ejemplo:

from cachetools import cached, LFUCache
import time
  
# Here if a particular item is not called 
# within 5 successive call of the function,
# it will be discarded
@cached(cache = LFUCache(maxsize = 5))
def myfun(n):
      
    # This delay resembles some task
    s = time.time()
    time.sleep(n)
    print("\nTime Taken: ", time.time() - s)
    return (f"I am executed: {n}")
  
print(myfun(3))
print(myfun(3))
print(myfun(2))
print(myfun(4))
print(myfun(1))
print(myfun(1))
print(myfun(3))
print(myfun(3))
print(myfun(4))

Producción:


Time Taken:  3.002413272857666
I am executed: 3
I am executed: 3

Time Taken:  2.002107620239258
I am executed: 2

Time Taken:  4.003819465637207
I am executed: 4

Time Taken:  1.0010886192321777
I am executed: 1
I am executed: 1
I am executed: 3
I am executed: 3
I am executed: 4

RRCache

RRCache o caché de «reemplazo aleatorio» es otro tipo de técnica de almacenamiento en caché que elige al azar elementos en el caché y los descarta para liberar espacio cuando es necesario. Toma un parámetro: «maxsize», que es el mismo que en LRUCache. También tiene una opción de parámetro que se establece de forma predeterminada en «random.choice».

Sintaxis:

@cached(cache= RRCache(maxsize= 33))
def some_fun():
    pass

Ejemplo:

from cachetools import cached, RRCache
import time
  
# Here if a particular item is not called
# within 5 successive call of the function,
# it will be discarded
@cached(cache = RRCache(maxsize = 5))
def myfun(n):
      
    # This delay resembles some task
    s = time.time()
    time.sleep(n)
    print("\nTime Taken: ", time.time() - s)
    return (f"I am executed: {n}")
  
print(myfun(3))
print(myfun(3))
print(myfun(2))
print(myfun(4))
print(myfun(1))
print(myfun(1))
print(myfun(3))
print(myfun(2))
print(myfun(3))

Producción:

Time Taken:  3.003124713897705
I am executed: 3
I am executed: 3

Time Taken:  2.0021231174468994
I am executed: 2

Time Taken:  4.004120588302612
I am executed: 4

Time Taken:  1.0011250972747803
I am executed: 1
I am executed: 1
I am executed: 3
I am executed: 2
I am executed: 3

Publicación traducida automáticamente

Artículo escrito por ayushmankumar7 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 *