Sobes.tech

# Cache ფუნქციისთვის კოდის დაწერა. ეს არის დეკორატორი, რომელიც უნდა # გახსოვდეს, რა დააბრუნა დეკორირებული ფუნქციამ, და დაბრუნდეს შენახული # მნიშვნელობა განმეორებითი გამოძახებისას იგივე არგუმენტებით. # შეიძლება ითქვას, რომ ყველა არგუმენტი ჰეშირებადი არის. # გამოიყენეთ მხოლოდ Python-ის სტანდარტული ბიბლიოთეკა.

140

რატომ არის აუცილებელი kwargs-ის სორტირება მემოიზაციის კეშის გასაღების შექმნისას?

131

არის აუცილებელი ჩვეულებრივი dict-ის ნაცვლად OrderedDict-ის გამოყენება მემოიზაციის ქეშისთვის, ზომის შეზღუდვის და გამოდევნის პოლიტიკის გარეშე?

117

In-memory კეშის შეზღუდვები და პრობლემები რა არის, განსაკუთრებით როდესაც მიკროჟგუფებს რამდენიმე მუშაკზე აძლიერებთ?

111

# დაწერეთ კოდი ფუნქციის 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")

106

# Cache ფუნქციის კოდი დაწერეთ. ეს უნდა იყოს დეკორატორი, რომელიც უნდა # გახსოვდეს, რა დააბრუნა დეკორირებულმა ფუნქციამ, და დაბრუნდეს შენახული # მნიშვნელობა განმეორებითი ზარებისას იგივე არგუმენტებით. # # შეიძლება ითქვას, რომ ყველა არგუმენტი ჰეშირებადი არის. # გამოიყენეთ მხოლოდ 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")

106

# კოდის დაწერა cache ფუნქციისთვის. ეს არის დეკორატორი, რომელიც უნდა # გახსოვდეს, რა დააბრუნა დეკორირებული ფუნქციამ, და დაბრუნდეს შენახული # მნიშვნელობა განმეორებითი გამოძახებისას იგივე არგუმენტებით. # # შეიძლება ითქვას, რომ ყველა არგუმენტი ჰეშებადი არის. # გამოიყენეთ მხოლოდ Python-ის სტანდარტული ბიბლიოთეკა.

98

როგორ ავიცილოთ თავიდან კეშის შეჯახებები სხვადასხვა ფუნქციებს შორის, რომლებიც ერთნაირ არგუმენტებს იყენებენ, მაგალითად add(2, 3) და multiply(2, 3)?

98

# # შეიძლება მივიჩნიოთ, რომ ყველა არგუმენტი ჰეშირებადი არის. # გამოიყენეთ მხოლოდ 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")

93

# ყველა არგუმენტი ჰეშირებადი უნდა იყოს, როგორც ვარაუდობენ. # გამოიყენეთ მხოლოდ 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")

93