-
Notifications
You must be signed in to change notification settings - Fork 0
/
lru_cache.py
116 lines (90 loc) · 2.68 KB
/
lru_cache.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
from collections import OrderedDict
class LRUCache(object):
length = 5
def __init__(self, max_length=5):
self.cache = OrderedDict()
self.length = max_length
def __setitem__(self, key, value):
if key in self.cache:
self.cache.move_to_end(key)
else:
self.cache[key] = value
if len(self.cache) > self.length:
self.cache.popitem(last=False)
def __getitem__(self, key):
if key in self.cache:
self.cache.move_to_end(key)
return self.cache[key]
else:
return 0
def __delitem__(self, key):
del self.cache[key]
def update_length(self,i):
self.length = i
#
cache = LRUCache(5)
#
def set_LRU_cache_size(i):
global cache
cache = LRUCache(i)
def lru_cache(cache_size):
def decorator(func):
cache.update_length(cache_size)
def LRUwrapper(*args, **kw):
if func.__name__ == 'get_request':
obj = args[0]
key=args[1]
payload = args[2]
temp = cache[key]
if temp:
return temp
else:
return func(obj, key, payload)
elif func.__name__ == 'put':
obj = args[0]
key = args[1]
payload = args[2]
cache[key]=payload
return func(obj, key, payload)
elif func.__name__ == 'delete':
obj = args[0]
key = args[1]
payload = args[2]
if cache[key]:
del cache[key]
return func(obj, key, payload)
else:
key = args[0]
temp = cache[key]
if temp:
print(f"[cache-hit] {func.__name__}({key}) -> {temp}")
return temp
else:
y = func(key)
cache[key] = y
print(f"[cache-missed] {func.__name__}({key}) -> {y}")
return y
return func(*args, **kw)
return LRUwrapper
return decorator
if __name__ == '__main__':
def test():
cache[1] = 2
cache[2] = 3
cache[3] = 4
cache[4] = 5
cache[1] = 2
@lru_cache(5)
def get(key, value):
return 'GET server'
@lru_cache(5)
def put(key,value):
return 'PUT to server'
@lru_cache(5)
def delete(key, value):
return 'del server'
print(put(4, 5))
print(get(4, 4))
print(delete(4, 4))
print(cache.cache)
test()