Skip to content

Commit ce52e53

Browse files
committed
Refactor LRU cache to use OrderedDict
1 parent 9e6f685 commit ce52e53

1 file changed

Lines changed: 10 additions & 43 deletions

File tree

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11

2-
class _Node:
3-
def __init__(self, key=None, value=None):
4-
self.key = key
5-
self.value = value
6-
self.prev = None
7-
self.next = None
2+
from collections import OrderedDict
83

94

105
class LruCache:
@@ -13,50 +8,22 @@ def __init__(self, limit):
138
raise ValueError("limit must be greater than zero")
149

1510
self.limit = limit
16-
self.cache = {}
17-
self.head = _Node()
18-
self.tail = _Node()
19-
20-
self.head.next = self.tail
21-
self.tail.prev = self.head
22-
23-
def _remove(self, node):
24-
node.prev.next = node.next
25-
node.next.prev = node.prev
26-
27-
def _add_to_front(self, node):
28-
node.prev = self.head
29-
node.next = self.head.next
30-
31-
self.head.next.prev = node
32-
self.head.next = node
33-
34-
def _mark_as_used(self, node):
35-
self._remove(node)
36-
self._add_to_front(node)
11+
self.cache = OrderedDict()
3712

3813
def get(self, key):
39-
node = self.cache.get(key)
40-
41-
if node is None:
14+
if key not in self.cache:
4215
return None
4316

44-
self._mark_as_used(node)
45-
return node.value
17+
self.cache.move_to_end(key)
18+
return self.cache[key]
4619

4720
def set(self, key, value):
48-
node = self.cache.get(key)
49-
50-
if node is not None:
51-
node.value = value
52-
self._mark_as_used(node)
21+
if key in self.cache:
22+
self.cache[key] = value
23+
self.cache.move_to_end(key)
5324
return
5425

55-
node = _Node(key, value)
56-
self.cache[key] = node
57-
self._add_to_front(node)
26+
self.cache[key] = value
5827

5928
if len(self.cache) > self.limit:
60-
lru_node = self.tail.prev
61-
self._remove(lru_node)
62-
del self.cache[lru_node.key]
29+
self.cache.popitem(last=False)

0 commit comments

Comments
 (0)