CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

main.py
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

main.py
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

Soru
from functools import lru_cache

@____(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)
Cevap
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.

İleri seviye bölümündeki tüm dersler