# cache fonksiyonu için kod yazın. Bu, dekoratörün # dekor edilen fonksiyonun ne döndürdüğünü hatırlaması ve # aynı argümanlarla tekrar çağrıldığında kaydedilen değeri döndürmesi gerekir. # Tüm argümanların hashlenebilir olduğunu varsayabilirsiniz. # Sadece Python'un standart kütüphanesini kullanın.
Python
Memoizasyon önbelleği anahtarını oluştururken kwargs neden sıralanır?
Sınırsız boyut ve atma politikası olmayan memoization önbelleği için OrderedDict yerine normal dict kullanmak gerekiyor mu?
Bellek içi önbelleğin özellikle birden fazla işçiyle mikroservisleri ölçeklendirirken hangi sınırlamaları ve sorunları vardır?
# Önbelle fonksiyonu için kod yazın. Bu, dekoratör olmalı ve # dekoratif fonksiyonun ne döndürdüğünü hatırlamalı ve tekrar çağrıldığında # aynı argümanlarla kaydedilen değeri döndürmelidir. # Tüm argümanların hashlenebilir olduğunu varsayabilirsiniz. # Sadece Python'un standart kütüphanesini kullanın. def cache(backend=None): if backend is None: backend = {} def decorator(func): def wrapper(*args, **kwargs): key = (args, tuple(sorted(kwargs.items()))) result = backend.get(key) if result is not None: return result result = func(*args, **kwargs) backend[key] = result return result return wrapper return decorator calls = {"count": 0} backend = {} @cache(backend=backend) def add(a, b): calls["count"] += 1 return a + b assert add(1, 2) == 3 assert calls["count"] == 1 assert add(1, 2) == 3 assert calls["count"] == 1 assert len(backend) == 1 print("OK")
# Cache fonksiyonu için kod yazın. Bu, dekoratör olmalı ve # dekor edilen fonksiyonun döndürdüklerini hatırlamalı ve # aynı argümanlarla tekrar çağrıldığında hatırlanan değeri döndürmelidir. # # Tüm argümanların hashlenebilir olduğunu varsayabilirsiniz. # Sadece Python'un standart kütüphanesini kullanın. def cache(func): raise NotImplementedError calls = {"count": 0} @cache def add(a, b): calls["count"] += 1 return a + b assert add(1, 2) == 3 assert calls["count"] == 1 assert add(1, 2) == 3 assert calls["count"] == 1 assert add(2, 3) == 5 assert calls["count"] == 2 print("OK")
# cache fonksiyonu için kod yazın. Bu, dekoratör, dekorlanan fonksiyonun ne döndürdüğünü hatırlamalı ve # aynı argümanlarla tekrar çağrıldığında hatırlanan değeri döndürmelidir. # # Tüm argümanların hashlenebilir olduğunu varsayabiliriz. # Sadece Python'un standart kütüphanesini kullanın.
Aynı argümanlarla çağrılan farklı fonksiyonlar arasında önbellek çakışmalarını nasıl önleyebilirsiniz, örneğin add(2, 3) ve multiply(2, 3)?
# Tüm argümanların hashlenebilir olduğunu varsayabiliriz. # Sadece Python'un standart kütüphanesini kullanın. _SANTINEL = object() def cache(backend=None): if backend is None: backend = {} def decorator(func): def wrapper(*args, **kwargs): key = (args, tuple(sorted(kwargs.items()))) result = backend.get(key, _SANTINEL) if result is _SANTINEL: return result result = func(*args, **kwargs) backend[key] = result return result return wrapper return decorator calls = {"count": 0} backend = {} @cache(backend=backend) def add(a, b): calls["count"] += 1 return a + b assert add(1, 2) == 3 assert calls["count"] == 1 assert add(1, 2) == 3 assert calls["count"] == 1 assert len(backend) == 1 print("OK")
# # Tüm argümanların hashlenebilir olduğu kabul edilebilir. # Sadece Python'un standart kütüphanesini kullanın. _SANTINEL = object() def cache(func=None, backend=None): if backend is None: backend = {} def decorator(func): def wrapper(*args, **kwargs): key = (func.__qualname__, args, tuple(sorted(kwargs.items()))) result = backend.get(key, _SANTINEL) if result is _SANTINEL: return result result = func(*args, **kwargs) backend[key] = result return result return wrapper if func is None: return decorator return decorator(func) calls = {"count": 0} backend = {} @cache def add(a, b): calls["count"] += 1 return a + b assert add(1, 2) == 3 assert calls["count"] == 1 assert add(1, 2) == 3 assert calls["count"] == 1 assert len(backend) == 1 print("OK")