functools
- Python kursu
- İleri seviye
- Ders 3/83
- 5 dk
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.
Başlangıç kodu
from functools import lru_cache
# fib özyinelemeli; lru_cache(maxsize=None) decorator'ü ile süsle
# taban: n<2 ise n döndür
# değilse iki alt çağrının toplamını döndür
# son olarak fib(10) çağrısının sonucunu yazdırÖrnek çözüm
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))Beklenen çıktı
55
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 lru_cache kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
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 |
2 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)
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
Açıklama: @lru_cache(maxsize=None) çağrıları önbelleğe alır; fib hızlanır.
3 lru_cache'li fonksiyona hangi argüman TÜRÜ geçilemez?
- Demet (tuple)
- Tamsayı
- Liste (list) Doğru cevap
- Dize (str)
Açıklama: Liste hashlenebilir değil; önbellek anahtarı olamaz. Demet kullanmalısın.