Python Functools lru_cache

Python Functools lru_cache
El módulo Functools de Python trata con funciones más altas o aquellas que operan (y toman como parámetros) o devuelven los otros objetos invocables como funciones. El módulo Functools ofrece una variedad de funciones que incluyen Wraps (FUNC), LRU_CACHE (FUNC), CMP a Key (FUNC) y Propiedad en caché (FUNC). Es importante tener en cuenta que estos métodos aceptan parámetros que son funciones. La memoización es un método de mejora del rendimiento utilizado por muchos idiomas, y Python no es una excepción. La memoización implica almacenar en caché los resultados de una llamada de método para que las llamadas posteriores con entradas idénticas no requieran recalcular los resultados desde cero.

Lru_cache, una herramienta de biblioteca estándar proporcionada por Python, se puede utilizar para lograr esto. Un decorador llamado lru_cache () utiliza el enfoque de memorización para acortar el tiempo que se ejecuta una función para las mismas entradas.

Para examinar la eficacia del caché y optimizar el argumento MaxSize, el método envuelto ofrece el método Cache_info () que crea una tupla etiquetada que comprende éxitos, fallas, maxSize y cursize. Debido a que lru_cache predeterminado se almacena en caché cada llamada al método que encapsula, el caché puede continuar expandiéndose indefinidamente mientras se ejecuta un programa.

Probablemente no necesite preocuparse de que el caché se vuelva demasiado grande si el rango de argumentos que acepta su función es limitado (por ejemplo, los únicos números 1 a 100). Para evitar el uso de toda la memoria, es posible que desee limitar el caché en algunas circunstancias a las posibilidades X máximas.
El "LRU" en LRU_CACHE se origina desde aquí. LRU o menos utilizado con frecuencia es un término utilizado para describir cómo se eliminan instantáneamente los objetos en el caché. Todos los datos se eliminan y guardan para los elementos de caché X más recientes.

Sintaxis del LRU_CACHE en Python

Una de esas funciones del módulo FunccTools que ayuda a disminuir el tiempo de ejecución de la función aplicando la técnica de memorización es LRU_CACHE (). La siguiente es la sintaxis del lru_cache proporcionado por Python:

@lru_cache (maxsize = 128, tipEd = false)

El decorador @lru_cache toma dos parámetros:

MAX_SIZE: la capacidad de almacenamiento máxima del caché se indica con esta opción después de lo cual se eliminan los elementos más antiguos. Cuando se establece en cero, nunca se eliminarán datos del caché, lo que hace que crezca eternamente. Si se almacenan en caché muchos datos, esto dará como resultado problemas.

Tipos: este argumento es booleano. Tener diferentes entradas en el caché para varios tipos de parámetros de función se indica cuando el valor se establece en verdadero.

Ejemplo 1: programa para imprimir la serie Fibonacci

Como su nombre lo indica, el caché mantiene el par de entradas/resultados más actuales al eliminar primero los registros menos recientes/más antiguos. Con la ayuda del caché LRU, imprimiremos la secuencia de Fibonacci. Por ejemplo, la serie Simple Fibonacci es 1, 1, 2, 3, 5, 8, etc. Desde 1+1 = 2, 1+2 = 3, y así sucesivamente. Comparemos las veces que toma la función mientras usa el LRU_CACHE y cuando no se usa usando el tiempo.

Desde Functools import lru_cache
tiempo de importación
def fib_without_cache (n):
Si n < 4:
regresar n
return fib_without_cache (n-1) + fib_without_cache (N-4)
BEGIN = TIEMPO.tiempo()
fib_without_cache (60)
final = tiempo.tiempo()
imprimir ("La ejecución de tiempo sin lru_cache es", final-begin)
@lru_cache (maxSize = 128)
def fib_with_cache (n):
Si n < 4:
regresar n
return fib_with_cache (N-1) + fib_with_cache (N-2)
BEGIN = TIEMPO.tiempo()
fib_with_cache (60)
final = tiempo.tiempo()
Imprimir ("Ejecución de tiempo con LRU_CACHE IS", Fin-Begin)

Aquí, del módulo de Functools de Python, importamos el LRU_CACHE. El tiempo también se importa en este script para la ejecución del tiempo. Luego, tenemos una definición de función que ha dado el nombre "fib_without_cache". La función se creó para calcular la serie Fibonacci sin el LRU_CACHE. Dentro de la función con la condición if, calculamos la serie Fibonacci aplicando su fórmula.

Después de eso, creamos un objeto "comenzar" donde se invoca la función de tiempo. El tiempo en segundos se pasa a la función "fib_without_cache". Con el objeto final, terminamos la ejecución del tiempo. La serie Fibonacci se imprime sin el comando lru_cache por el comando de impresión. La serie Fibonacci se implementó sin la función LRU_CACHE, como demostramos.

Ahora, implementamos la función lru_cache. Establecemos el valor de entrada max_size en la función lru_cache. Usando el decorador lru_cache, envolvemos la función "fib_with_cache". La serie Fibonacci se puede determinar muy rápidamente haciendo esto. La serie Fibonacci se evalúa aplicando su fórmula. La ejecución del tiempo comienza con el objeto inicial y termina con el objeto final. Por último, imprimimos el resultado que se forma con el decorador LRU_CACHE.

Puede ver la salida de la serie Fibonacci con y sin el decorador de caché LRU de la siguiente manera:

Ejemplo 2: programa para contar la vocal desde la cadena

Cuentamos el número de vocales que tiene la cadena proporcionada utilizando el decorador LRU_CACHE.

Desde Functools import lru_cache
@lru_cache (maxSize = 50)
Def Count_Vowels (cadena):
cadena = cadena.casefold ()
suma de retorno (cadena.Count (vocal) para vocal en 'aeiou')
print (count_vowels ("Hola Geeks"))

Primero, incluimos el lru_cache en nuestro script y luego usamos el decorador lru_cache. Dentro del decorador LRU_CACHE, pasamos el MaxSize como argumento y establecimos su valor en 50. Luego, creamos una función con el nombre "Count_Vowels" que toma la variable "cadena" como una entrada. Establecemos el método de caseflet en la variable de cadena. El método de Casefold aquí convierte los caracteres en minúsculas que se dan en la cadena.

Luego, tenemos el comando de retorno que da la suma de las vocales que se encuentran en la cadena. A la instrucción de impresión, especificamos la cadena "Hola Geeks".

El siguiente es un valor entero obtenido que es la suma de la vocal que se encuentra en la cadena:

Conclusión

Cubrimos el lru_cache en python con su sintaxis y ejemplos. La salida y los parámetros se guardan cuando se llama a una función encerrada en el lru_cache. Luego se llama a la función nuevamente, y si se encuentra la misma entrada, la salida de la llamada anterior se devuelve sin realizar ningún cálculo.