0Pricing
Python Academy · Ders

functools: lru_cache ve cached_property

Maliyeti yüksek hesaplamaları lru_cache ve cached_property ile önbelleğe alın.

functools: lru_cache ve cached_property, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.

Anımsama Nedir

Anımsama, bir işlev çağrısının sonucunu bağımsız değişkenlerine göre önbelleğe alır. Aynı bağımsız değişkenlerle yapılan yinelenen çağrılar, önbellekteki sonucu anında döndürür.

def slow_fib(n):
    if n < 2: return n
    return slow_fib(n-1) + slow_fib(n-2)

# slow_fib(35) makes ~29 million calls
# With caching it makes only 35

@lru_cache

@functools.lru_cache(maxsize=128), en fazla maxsize adet sonucun önbelleğe alınmasını sağlar. Sınırsız bir önbellek için maxsize=None ayarlayın.

import functools

@functools.lru_cache(maxsize=None)
def fib(n):
    if n < 2: return n
    return fib(n-1) + fib(n-2)

print(fib(50))  # instant

@cache — Python 3.9+

functools.cache, lru_cache(maxsize=None) için daha sade adlı sınırsız bir önbellek sağlayan kısa yazımdır.

import functools

@functools.cache
def factorial(n):
    return n * factorial(n-1) if n else 1

print(factorial(10))  # 3628800

Önbellek Bilgileri ve Temizleme

Önbelleğe alınan işlevler .cache_info() (başarılı bulmalar, başarısız bulmalar ve boyut) ile .cache_clear() yöntemlerini sunar.

import functools

@functools.lru_cache(maxsize=100)
def square(n):
    return n * n

for i in range(5): square(i % 3)
print(square.cache_info())
# CacheInfo(hits=2, misses=3, maxsize=100, currsize=3)
square.cache_clear()

LRU Çıkarma Politikası

LRU (En Az Yakın Zamanda Kullanılan), önbellek dolduğunda en uzun süredir erişilmeyen öğeyi çıkarır.

import functools

@functools.lru_cache(maxsize=3)
def compute(n):
    print(f"computing {n}")
    return n**2

for x in [1,2,3,4,1]:   # 4 evicts 1 (LRU), then 1 re-computes
    compute(x)

Yalnızca Özetlenebilir Bağımsız Değişkenler

lru_cache, tüm bağımsız değişkenlerin özetlenebilir olmasını gerektirir. Listeler ve sözlükler özetlenebilir değildir; bunun yerine demetleri kullanın.

import functools

@functools.lru_cache(maxsize=None)
def sum_tuple(t):  # tuple is hashable
    return sum(t)

print(sum_tuple((1,2,3)))  # 6
# sum_tuple([1,2,3])  # TypeError

@cached_property

functools.cached_property, bir özelliği bir kez hesaplar ve sonucu örnekte önbelleğe alır; tanımlayıcıyı değerle değiştirir.

import functools

class Circle:
    def __init__(self, r):
        self.r = r

    @functools.cached_property
    def area(self):
        import math
        print("computing...")
        return math.pi * self.r ** 2

c = Circle(5)
print(c.area)   # computing...  78.53...
print(c.area)   # 78.53... (cached, no print)

cached_property ve property Karşılaştırması

@property, her erişimde yeniden hesaplama yapar. @cached_property ise bir kez hesaplar ve sonucu instance.__dict__ içinde saklar.

import functools

class Expensive:
    @property
    def always(self):    # runs every access
        return sum(range(1_000_000))

    @functools.cached_property
    def once(self):      # runs only first access
        return sum(range(1_000_000))

cached_property İş Parçacığı Güvenliği

cached_property iş parçacığı açısından güvenli değildir. Birden çok iş parçacığı aynı anda erişirse hesaplama birden fazla kez çalışabilir. Gerekirse kilit kullanın.

import functools, threading

class SafeCache:
    _lock = threading.Lock()

    @functools.cached_property
    def data(self):
        with self._lock:
            return expensive_computation()

cached_property Önbelleğini Geçersiz Kılma

Önbelleği geçersiz kılmak ve bir sonraki erişimde yeniden hesaplamayı zorlamak için örnek özniteliğini silin.

import functools

class Report:
    @functools.cached_property
    def summary(self):
        return compute_summary()

r = Report()
_ = r.summary      # computed
del r.summary      # invalidate
_ = r.summary      # recomputed

lru_cache'i API Önbelleği Olarak Kullanma

Gereksiz ağ çağrılarını önlemek için bir oturumdaki API yanıtlarını önbelleğe alın. Güncel veriler gerektiğinde önbelleği temizleyin.

import functools, urllib.request, json

@functools.lru_cache(maxsize=32)
def get_user(user_id):
    url = f"https://api.example.com/users/{user_id}"
    with urllib.request.urlopen(url) as r:
        return json.loads(r.read())

user = get_user(42)   # network call
user = get_user(42)   # cached

Hızlı Kontrol

@lru_cache ile dekoratör uygulanmış bir işlevin önbelleğe alınan tüm sonuçlarını hangi yöntem temizler?

Özet

@lru_cache, işlev sonuçlarını bağımsız değişkenlerine göre önbelleğe alır (bağımsız değişkenlerin özetlenebilir olması gerekir). @cache, sınırsız bir diğer addır. @cached_property, her örnekte bir özellik hesaplamasını önbelleğe alır. cache_info() ile inceleyin ve cache_clear() ile sıfırlayın.

Sıkça Sorulan Sorular

“functools: lru_cache ve cached_property” dersi ücretsiz mi?

Evet — “functools: lru_cache ve cached_property” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.

“functools: lru_cache ve cached_property” dersinde ne öğreneceğim?

Maliyeti yüksek hesaplamaları lru_cache ve cached_property ile önbelleğe alın. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Python Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“functools: lru_cache ve cached_property” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. itertools: Sonsuz ve Sonlu Yineleyiciler
  2. itertools: Kombinatorik
  3. functools: partial ve reduce
  4. functools: lru_cache ve cached_property
← Python Academy Sayfasına Dön