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