# Գրեք կոդ cache ֆունկցիայի համար: Դա դեկորատոր է, որը պետք է # հիշի, թե ինչ է վերադարձրել դեկորատորացված ֆունկցիան և # վերադարձնի հիշեցված արժեքը կրկնակի կանչերի ժամանակ նույն արգումենտներով: # Կարող եք ենթադրել, որ բոլոր արգումենտները հեշավորվող են: # Օգտագործեք միայն Python-ի ստանդարտ գրադարանն։
Python
Ինչու՞ է անհրաժեշտ կարգավորել kwargs-ները մեմոիզացիայի կեշի բանալի կառուցելիս։
Պետք է արդյոք օգտագործել OrderedDict՝ առանց չափի սահմանափակման և արտաքսման քաղաքականության, սովորական dict-ի փոխարեն մեմոիզացիայի համար?
In-memory կեշի սահմանափակումներն ու խնդիրները ինչ են, հատկապես երբ միկրոսերվիսները մեծացնում եք մի քանի աշխատողների վրա?
# Գրեք կոդ 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")