# Cache функцияси учун код ёзинг. Бу декоратор бўлиб, # декорация қилинган функция нима қайтарганини эслаб қолиши ва # қайтарилган қийматни қайтариши керак. # Барча аргументлар хешланадиган деб ҳисоблаш мумкин. # Фақат Pythonнинг стандарт кутубхонасидан фойдаланинг.
Python
Чаро сорт кардани kwargs ҳангоми сохтани калиди cache-и memoization?
Оё лозим аст, ки барои кеши мемоизатсия бе маҳдудияти андоза ва сиёсати хориҷ кардан, ба ҷои dict оддӣ, OrderedDict истифода шавад?
Масъулоти ва мушкилоти кеши дар хотира, махсусан ҳангоми васеъ кардани микросервисҳо ба чанд коргар?
# Язиши код за функцијата cache. Ова е декоратор кој треба # да се сети што ја врати декорираната функција, и да врати зачуваната # вредност при повторен повик со исти аргументи. # Може да се претпостави дека сите аргументи се хеширачки. # Користете само стандардната библиотека на Python. 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. Είναι ένας διακοσμητής που # πρέπει να θυμάται τι επέστρεψε η διακοσμημένη λειτουργία και να # επιστρέφει την αποθηκευμένη τιμή σε επαναλαμβανόμενες κλήσεις με τα ίδια # επιχειρήματα. # # Μπορεί να υποτεθεί ότι όλα τα επιχειρήματα είναι hashable. # Χρησιμοποιήστε μόνο τη βασική βιβλιοθήκη Python. 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 нависед. Ин як декоратор аст, ки бояд # он чизеро, ки функсияи ороишёрона баргардондааст, ба ёд орад ва # арзишро, ки дар такрори даъват бо аргументҳои якхела, нигоҳ дошта шудааст, # баргардонад. # # Мумкин аст, ки ҳамаи аргументҳо ҳешшаванда бошанд. # Танҳо китобхонаи стандартии Python-ро истифода баред.
Чӣ гуна бояд аз ҳамҷоягии кеш байни функсияҳои гуногун, ки бо аргументҳои якхела, масалан add(2, 3) ва multiply(2, 3) даъват мешаванд, пешгирӣ кард?
# # Можно считать, что все аргументы хешируемые. # Используйте только стандартную библиотеку Python. _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")
# Можна вважати, що всі аргументи хешовані. # Використовуйте лише стандартну бібліотеку 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")