# Cache funksiyası üçün kod yazın. Bu, dekorator olmalı # dekorasiya edilmiş funksiyanın nə qaytardığını yadda saxlamalı və # eyni arqumentlərlə təkrar çağırışlarda yadda saxlanılan dəyəri qaytarmalıdır. # Bütün arqumentlərin hash edilə biləcəyini qəbul edə bilərsiniz. # Yalnız Python-un standart kitabxanasını istifadə edin.
Python
Memoizasiya keşi açarını qurarkən kwargs ni niyə sıralayırıq?
Həcm məhdudiyyəti və çıxarılma siyasəti olmadan memoization keşi üçün adi dict yerinə OrderedDict istifadə etmək lazımdırmı?
Yaddaşda saxlanan keşi məhdudiyyətləri və problemləri nələrdir, xüsusən mikroxidmətləri bir neçə işçiyə miqyaslandırarkən?
# Cache funksiyası üçün kod yazın. Bu, dekorator olmalı və # dekorasiya edilmiş funksiyanın geri qaytardığı dəyəri yadda saxlamalı və # eyni arqumentlərlə təkrar çağırışlarda yadda saxlanılan dəyəri qaytarmalıdır. # # Bütün arqumentlərin hash edilə biləcəyini qəbul etmək olar. # Yalnız Python-un standart kitabxanasını istifadə edin. 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")
# Ö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 funksiyası üçün kod yazın. Bu, dekorator olmalı və # dekorasiya olunmuş funksiyanın nə qaytardığını yadda saxlamalı və # təkrarlanan çağırışlarda yadda saxlanılan dəyəri qaytarmalıdır. # # Bütün arqumentlərin hash edilə biləcəyini qəbul etmək olar. # Yalnız Python-un standart kitabxanasını istifadə edin.
Eyni arqumentlərlə çağırılan müxtəlif funksiyalar arasında keş toqquşmalarını necə qarşısını almaq olar, məsələn add(2, 3) və multiply(2, 3)?
# Можно считать, что все аргументы хешируемые. # Используйте только стандартную библиотеку Python. _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")
# # Bütün argümanların hashlenebilir olduğunu varsayabiliriz. # 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")