From 9e6f685546302e4b83195cbc2d8ad92aa4b041c1 Mon Sep 17 00:00:00 2001 From: shreefAhmedM Date: Wed, 14 Oct 2026 15:58:39 +0100 Subject: [PATCH 1/2] Implement a cache in Python with an LRU --- Sprint-2/implement_lru_cache/lru_cache.py | 62 +++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/Sprint-2/implement_lru_cache/lru_cache.py b/Sprint-2/implement_lru_cache/lru_cache.py index e69de29b..4d0a1b6e 100644 --- a/Sprint-2/implement_lru_cache/lru_cache.py +++ b/Sprint-2/implement_lru_cache/lru_cache.py @@ -0,0 +1,62 @@ + +class _Node: + def __init__(self, key=None, value=None): + self.key = key + self.value = value + self.prev = None + self.next = None + + +class LruCache: + def __init__(self, limit): + if limit <= 0: + raise ValueError("limit must be greater than zero") + + self.limit = limit + self.cache = {} + self.head = _Node() + self.tail = _Node() + + self.head.next = self.tail + self.tail.prev = self.head + + def _remove(self, node): + node.prev.next = node.next + node.next.prev = node.prev + + def _add_to_front(self, node): + node.prev = self.head + node.next = self.head.next + + self.head.next.prev = node + self.head.next = node + + def _mark_as_used(self, node): + self._remove(node) + self._add_to_front(node) + + def get(self, key): + node = self.cache.get(key) + + if node is None: + return None + + self._mark_as_used(node) + return node.value + + def set(self, key, value): + node = self.cache.get(key) + + if node is not None: + node.value = value + self._mark_as_used(node) + return + + node = _Node(key, value) + self.cache[key] = node + self._add_to_front(node) + + if len(self.cache) > self.limit: + lru_node = self.tail.prev + self._remove(lru_node) + del self.cache[lru_node.key] \ No newline at end of file From ce52e53fa71271695f3fa0ff7a017982102374f2 Mon Sep 17 00:00:00 2001 From: shreefAhmedM Date: Fri, 16 Oct 2026 17:31:47 +0100 Subject: [PATCH 2/2] Refactor LRU cache to use OrderedDict --- Sprint-2/implement_lru_cache/lru_cache.py | 53 +++++------------------ 1 file changed, 10 insertions(+), 43 deletions(-) diff --git a/Sprint-2/implement_lru_cache/lru_cache.py b/Sprint-2/implement_lru_cache/lru_cache.py index 4d0a1b6e..5da2108f 100644 --- a/Sprint-2/implement_lru_cache/lru_cache.py +++ b/Sprint-2/implement_lru_cache/lru_cache.py @@ -1,10 +1,5 @@ -class _Node: - def __init__(self, key=None, value=None): - self.key = key - self.value = value - self.prev = None - self.next = None +from collections import OrderedDict class LruCache: @@ -13,50 +8,22 @@ def __init__(self, limit): raise ValueError("limit must be greater than zero") self.limit = limit - self.cache = {} - self.head = _Node() - self.tail = _Node() - - self.head.next = self.tail - self.tail.prev = self.head - - def _remove(self, node): - node.prev.next = node.next - node.next.prev = node.prev - - def _add_to_front(self, node): - node.prev = self.head - node.next = self.head.next - - self.head.next.prev = node - self.head.next = node - - def _mark_as_used(self, node): - self._remove(node) - self._add_to_front(node) + self.cache = OrderedDict() def get(self, key): - node = self.cache.get(key) - - if node is None: + if key not in self.cache: return None - self._mark_as_used(node) - return node.value + self.cache.move_to_end(key) + return self.cache[key] def set(self, key, value): - node = self.cache.get(key) - - if node is not None: - node.value = value - self._mark_as_used(node) + if key in self.cache: + self.cache[key] = value + self.cache.move_to_end(key) return - node = _Node(key, value) - self.cache[key] = node - self._add_to_front(node) + self.cache[key] = value if len(self.cache) > self.limit: - lru_node = self.tail.prev - self._remove(lru_node) - del self.cache[lru_node.key] \ No newline at end of file + self.cache.popitem(last=False)