Ce face functools.lru_cache() și functools.cache()
Decoratorul @lru_cache păstrează rezultatele ultimelor maxsize apeluri diferite. Când funcția este apelată din nou cu aceleași argumente, rezultatul vine din memorie, fără să mai fie calculat. „LRU” înseamnă că, la umplere, se șterge rezultatul folosit cel mai demult.
@cache (Python 3.9+) este echivalent cu lru_cache(maxsize=None): fără limită. Funcția decorată primește metodele cache_info() (statistici) și cache_clear(). Argumentele trebuie să aibă hash (fără liste sau dicționare).
Parametri
| Parametru | Descriere |
|---|---|
maxsize |
Numărul maxim de rezultate păstrate; None = fără limită. |
typed |
Dacă este True, f(3) și f(3.0) sunt memorate separat. |
Ce returnează
Funcția decorată, cu cache.
Exemple
Exemplul 1: Fibonacci rapid
from functools import cache, lru_cache
@cache
def fib(n):
return n if n < 2 else fib(n - 1) + fib(n - 2)
print(fib(100))
print(fib.cache_info())
@lru_cache(maxsize=2)
def patrat(x):
print(" calculez", x)
return x * x
for x in [2, 3, 2, 4, 2]:
print(patrat(x))
print(patrat.cache_info())
Rezultat
354224848179261915075
CacheInfo(hits=98, misses=101, maxsize=None, currsize=101)
calculez 2
4
calculez 3
9
4
calculez 4
16
4
CacheInfo(hits=2, misses=3, maxsize=2, currsize=2)
Greșeli frecvente
- Pui cache pe o funcție care depinde de timp, de fișiere sau de date care se schimbă. Rezultatul memorat devine învechit.
- Apelezi funcția cu o listă:
TypeError: unhashable type: 'list'. Transmite un tuplu.
Comenzi înrudite
functools.cached_property: O proprietate calculată o singură dată per obiect, apoi păstrată ca atribut obișnuit.functools.wraps() și update_wrapper(): Copiază numele și documentația funcției originale pe funcția creată de un decorator.dict (dicționare): Dicționarul păstrează perechi cheie: valoare și găsește rapid valoarea după cheie.