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 # recomputedlru_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) # cachedHı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
- itertools: Sonsuz ve Sonlu Yineleyiciler
- itertools: Kombinatorik
- functools: partial ve reduce
- functools: lru_cache ve cached_property