Python
functools
functools.lru_cache ile önbelleğe almayı öğrenirsin.
functools ve lru_cache
functools modülü, yüksek dereceli fonksiyonlar için yardımcılar sunar. En sık kullanılanı lru_cache'tir; tekrar tekrar yapılan çağrıların sonucunu hafızada tutar (memoization).
Örneğin özyinelemeli fib(n) çok pahalıdır; her çağrı iki alt çağrı yapar. @lru_cache(maxsize=None) ile süslemek, sonuçları bir sözlükte saklar; aynı n tekrar gelirse anında döner.
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
maxsize=None sınırsız önbellek demektir; küçük maxsize verirsen en son kullanılanlar atılır (LRU).
Önbellek davranışı ve sınırlar
lru_cache bir sözlük gibi davranır: anahtar, fonksiyona geçirilen argümanlardır. Aynı argümanlar tekrar gelirse hesaplama yapılmaz.
maxsize sınırını küçük tutmak, bellek tüketimini denetler. maxsize=128 dersen sadece son 128 farklı çağrı tutulur; yeni çağrı gelince en eski düşer. fib.cache_info() ile kaç isabet, kaç ıskadan oluştuğunu görebilirsin.
Dikkat: önbelleklenmiş fonksiyonların argümanları hashlenebilir olmalıdır. Liste veya sözlük geçemezsin; değişmez bir demet (tuple) kullan.
Uygulama lru_cache ile fib önbellekle
fib(n) özyinelemeli fonksiyonunu @lru_cache(maxsize=None) ile süsle. Taban durum n < 2 ise n döndürsün; değilse fib(n-1) + fib(n-2) döndürsün. En son print(fib(10)) yaz.
Örnek çözümü göster
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
print(fib(10))
Kendini test et
-
lru_cache kavramlarını eşleştir
- lru_cache
- Sonuç önbelleği
- maxsize=None
- Sınırsız önbellek
- maxsize=128
- LRU düşürme
- fib(n-1)+fib(n-2)
- Özyinelemeli adım
-
lru_cache decorator'ünü ekle
from functools import lru_cache
@____(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
Cevabı göster
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
-
lru_cache'li fonksiyona hangi argüman TÜRÜ geçilemez?
- Demet (tuple)
- Tamsayı
- Liste (list)
- Dize (str)
Cevabı göster
Liste (list) — Liste hashlenebilir değil; önbellek anahtarı olamaz. Demet kullanmalısın.
Sıradaki ders: functools.partial