Python Functools LRU_CACHE

Python Functools LRU_CACHE
Il modulo FUNCTOOLS di Python si occupa di funzioni più elevate o di quelle che operano (e prendono come parametri) o restituiscono gli altri oggetti richiamabili come le funzioni. Il modulo FUNCTools offre una varietà di funzioni tra cui Wraps (Func), LRU_CACHE (FUNC), CMP a Key (Func) e Cached Property (Func). È importante notare che questi metodi accettano parametri che sono funzioni. La memorizzazione è un metodo di miglioramento delle prestazioni utilizzato da molte lingue e Python non fa eccezione. La memorizzazione comporta la memorizzazione nella cache dei risultati di una chiamata di metodo in modo che le chiamate successive con input identici non richiedano ricalcolando i risultati da zero.

LRU_CACHE, uno strumento di libreria standard fornito da Python, può essere utilizzato per raggiungere questo obiettivo. Un decoratore chiamato lru_cache () utilizza l'approccio di memoizzazione per abbreviare il periodo di tempo in cui una funzione viene eseguita per gli stessi input.

Per esaminare l'efficacia della cache e ottimizzare l'argomento maxsize, il metodo avvolto offre il metodo Cache_info () che crea una tupla etichettata che comprende colpi, guasti, maxsize e curva. Poiché LRU_CACHE è il valore predefinito per memorizzare nella cache ogni chiamata al metodo che incapsula, la cache può continuare ad espandersi indefinitamente mentre un programma è in esecuzione.

Probabilmente non devi preoccuparti che la cache diventa troppo grande se la gamma di argomenti che la tua funzione accetta è limitata (ad esempio, gli unici numeri da 1 a 100). Per evitare di utilizzare tutta la memoria, potresti voler limitare la cache in alcune circostanze alle massime possibilità di X.
La "lru" in lru_cache ha origine da qui. LRU o meno frequentemente utilizzato è un termine usato per descrivere come gli oggetti nella cache vengono immediatamente rimossi. Tutti i dati vengono rimossi e salvati per gli articoli cache più recenti.

Sintassi di LRU_CACHE in Python

Una di queste funzioni del modulo FUNCTools che aiuta a ridurre il tempo di esecuzione della funzione applicando la tecnica di memorizzazione è LRU_CACHE (). Di seguito è la sintassi della lru_cache fornita da Python:

@lru_cache (maxsize = 128, digitato = false)

Il decoratore @lru_cache prende due parametri:

Max_size: la capacità di archiviazione massima della cache è indicata da questa opzione dopo la quale gli elementi più vecchi vengono rimossi. Quando è impostato su zero, nessun dato verrà mai rimosso dalla cache, il che fa crescere eternamente. Se molti dati vengono memorizzati nella cache, ciò comporterà problemi.

Tipi: questo argomento è booleano. Avere voci diverse nella cache per vari tipi di parametri della funzione è indicato quando il valore è impostato su True.

Esempio 1: programma per stampare la serie Fibonacci

Come suggerisce il nome, la cache mantiene la coppia di input/risultati più attuali eliminando prima i record meno recenti/più antichi. Con l'aiuto della cache LRU, stamperemo la sequenza Fibonacci. Ad esempio, la semplice serie Fibonacci è 1, 1, 2, 3, 5, 8, ecc. poiché 1+1 = 2, 1+2 = 3 e così via. Confrontiamo i tempi che la funzione prende durante l'utilizzo di LRU_CACHE e quando non viene utilizzata usando il tempo.

da functools import lru_cache
tempo di importazione
def fib_without_cache (n):
Se n < 4:
restituire n
restituisce FIB_WITHOUT_CACHE (N-1) + FIB_WITHOUT_CACHE (N-4)
Inizia = tempo.tempo()
FIB_WITHOUT_CACHE (60)
fine = tempo.tempo()
Stampa ("Esecuzione del tempo senza lru_cache è", end-begin)
@lru_cache (maxsize = 128)
def fib_with_cache (n):
Se n < 4:
restituire n
restituisce fib_with_cache (n-1) + fib_with_cache (n-2)
Inizia = tempo.tempo()
FIB_WITH_CACHE (60)
fine = tempo.tempo()
Stampa ("Esecuzione del tempo con LRU_CACHE IS", End-Begin)

Qui, dal modulo Python Functools, abbiamo importato LRU_CACHE. Il tempo viene anche importato in questo script per l'esecuzione del tempo. Quindi, abbiamo una definizione di funzione che ha dato il nome "FIB_WITHOUT_CACHE". La funzione è stata creata per calcolare la serie Fibonacci senza LRU_CACHE. All'interno della funzione con la condizione if, abbiamo calcolato la serie Fibonacci applicando la sua formula.

Successivamente, abbiamo creato un oggetto "inizia" in cui viene invocata la funzione temporale. Il tempo in secondi viene passato alla funzione "FIB_WITHOUT_CACHE". Con l'oggetto finale, abbiamo concluso l'esecuzione del tempo. La serie Fibonacci è stampata senza il comando LRU_CACHE. La serie Fibonacci è stata implementata senza la funzione LRU_CACHE, come abbiamo dimostrato.

Ora distribuiamo la funzione LRU_CACHE. Impostiamo il valore di input max_size sulla funzione lru_cache. Usando il decoratore LRU_CACHE, abbiamo quindi avvolto la funzione "FIB_WITH_CACHE". La serie Fibonacci può essere determinata molto rapidamente facendo questo. La serie Fibonacci viene valutata applicando la sua formula. L'esecuzione del tempo inizia con l'oggetto iniziale e termina con l'oggetto finale. Infine, abbiamo stampato il risultato che si forma con il decoratore LRU_CACHE.

Puoi vedere l'output della serie Fibonacci con e senza il decoratore della cache LRU come segue:

Esempio 2: programma per contare la vocale dalla stringa

Contiamo il numero di vocali che la stringa fornita ha utilizzando il decoratore LRU_CACHE.

da functools import lru_cache
@lru_cache (maxsize = 50)
def cote_vowels (stringa):
String = String.casifold ()
Somma di ritorno (stringa.conta (vocale) per vocale in 'aeiou')
print (count_vowels ("Hello geeks"))

Innanzitutto, abbiamo incluso LRU_CACHE nel nostro script e poi abbiamo usato il decoratore LRU_CACHE. All'interno del decoratore LRU_CACHE, abbiamo superato il massimo come argomento e abbiamo impostato il suo valore su 50. Quindi, abbiamo creato una funzione con il nome "Count_Vowels" che prende la variabile "String" come input. Impostiamo il metodo Casefold nella variabile String. Il metodo Casefold qui converte i caratteri nel minuscolo indicato nella stringa.

Quindi, abbiamo il comando di ritorno che dà la somma delle vocali trovate nella stringa. Alla dichiarazione di stampa, abbiamo specificato la stringa "Hello Geeks".

Quello che segue è un valore intero ottenuto che è la somma della vocale trovata nella stringa:

Conclusione

Abbiamo coperto il lru_cache in python con la sua sintassi ed esempi. L'output e i parametri vengono salvati quando viene chiamata una funzione racchiusa nel lru_cache. La funzione viene quindi nuovamente chiamata e, se viene trovato lo stesso input, l'uscita della chiamata precedente viene restituito senza eseguire alcun calcolo.