Skip to content

Instantly share code, notes, and snippets.

@chiragjn
Created December 13, 2021 06:13
Show Gist options
  • Save chiragjn/6439b3d5d1eabd72af498c87b72b6ac9 to your computer and use it in GitHub Desktop.
Save chiragjn/6439b3d5d1eabd72af498c87b72b6ac9 to your computer and use it in GitHub Desktop.
Sample lru dict impl
import collections
from typing import Optional, TypeVar, ContextManager, Generic, Any, MutableMapping
class LRUDict(collections.OrderedDict, MutableMapping[_KT, _VT]):
def __init__(self, max_size: Optional[int] = None, min_size: int = 0):
super().__init__()
self.min_size = min_size
self.max_size = max_size
if self.max_size and self.max_size < self.min_size:
raise ValueError(f'`max_size` cannot be smaller than `min_size` ({self.min_size})')
def __setitem__(self, key, value):
if self.max_size and len(self) >= self.max_size and key not in self:
self.evict_oldest()
oldest = next(iter(self))
del self[oldest]
return super().__setitem__(key, value)
def __getitem__(self, key):
if key in self:
self.move_to_end(key, last=True)
return super().__getitem__(key)
def evict_oldest(self):
if len(self) > self.min_size:
oldest = next(iter(self))
del self[oldest]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment