functools.lru_cache: Accelera Python con una Riga di Codice
functools.lru_cache: Accelera Python con una Riga di Codice
Quando usarlo
Hai funzioni che fanno calcoli costosi con gli stessi parametri ripetutamente? lru_cache memorizza automaticamente i risultati, trasformando chiamate lente in lookup istantanei. Perfetto per ricorsioni, chiamate API, calcoli matematici complessi, o qualsiasi funzione “pura” che restituisce sempre lo stesso output per lo stesso input.
Snippet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from functools import lru_cache
import time
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
@lru_cache(maxsize=None) # cache illimitata
def calcolo_lento(x, y):
time.sleep(1) # simula calcolo pesante
return x * y + x ** 2
# Prima chiamata: lenta
start = time.time()
result = calcolo_lento(5, 10)
print(f"Prima: {time.time() - start:.2f}s")
# Seconda chiamata: istantanea!
start = time.time()
result = calcolo_lento(5, 10)
print(f"Seconda: {time.time() - start:.4f}s")
Perché funziona
lru_cache implementa una Least Recently Used cache che memorizza risultati di funzioni usando parametri come chiave. Quando la funzione viene chiamata, controlla prima se il risultato è già in cache. Se sì, lo restituisce immediatamente; altrimenti calcola, memorizza e restituisce il risultato.
Attenzione a…
- Funziona solo con parametri “hashable” (no liste, dizionari come argomenti)
- Può consumare molta memoria se
maxsize=Nonecon molti input diversi - Non usare con funzioni che hanno side effects o dipendono da stato esterno
Vedi anche
functools.cache(Python 3.9+) per cache illimitata semplificatafunctools.singledispatchper overloading di funzioni- Documentazione functools
This post is licensed under CC BY 4.0 by the author.