from
collections
import
deque
class
LRUCache:
def
__init__(
self
, size
=
5
):
self
.size
=
size
self
.container
=
deque()
self
.
map
=
dict
()
def
reallocate(
self
):
if
len
(
self
.container) >
1
:
for
key, val
in
enumerate
(
self
.container):
self
.
map
[val]
=
key
def
access(
self
, val):
self
.container.remove(val)
self
.container.appendleft(val)
self
.reallocate()
def
evict(
self
, val):
if
val
in
self
.
map
:
self
.container.remove(val)
else
:
x
=
self
.container.pop()
del
self
.
map
[x]
self
.normal_insert(val)
def
normal_insert(
self
, val):
self
.container.appendleft(val)
self
.reallocate()
def
insert(
self
, val):
if
val
in
self
.
map
.keys():
self
.access(val)
else
:
if
(
len
(
self
.
map
.keys())
=
=
self
.size):
self
.evict(val)
else
:
self
.normal_insert(val)
def
print
(
self
):
lru_elements
=
[x
for
x
in
self
.container]
print
(lru_elements)
def
LRUDecorator(size):
lru
=
LRUCache(size)
def
decorator(function):
def
functionality(num):
lru.insert(num)
lru.
print
()
print
(num, function(num))
return
functionality
return
decorator
@LRUDecorator
(size
=
4
)
def
ex_func_01(n):
print
(f
'Computing...{n}'
)
time.sleep(
1
)
return
n
print
(f
'\nFunction: ex_func_01'
)
print
(ex_func_01(
1
))
print
(ex_func_01(
2
))
print
(ex_func_01(
3
))
print
(ex_func_01(
4
))
print
(ex_func_01(
1
))
print
(ex_func_01(
2
))
print
(ex_func_01(
5
))
print
(ex_func_01(
1
))
print
(ex_func_01(
2
))
print
(ex_func_01(
3
))
print
(ex_func_01(
4
))
print
(ex_func_01(
5
))