Beispiel #1
0
class LRUCache(object):
    def __init__(self, size):
        if size < 1:
            raise ValueException('Value for cache size should be positive, '
                                 'provided: {0}'.format(size))
        self.size = size
        self.value_map = {}
        self.recents = LinkedList()

    def get(self, key):
        try:
            node, value = self.value_map[key]
            self.recents.remove_node(node)
            self.recents.push_front(node)
            return value
        except KeyError as k:
            raise CacheMissException(key)

    def put(self, key, value):
        try:
            node, old_value = self.value_map[key]
            self.recents.remove_node(node)
        except KeyError as k:  # not in map
            if len(self.recents) >= self.size:
                back_node = self.recents.pop_back()
                del self.value_map[back_node.data]
            node = LinkedListNode(key)
        self.recents.push_front(node)
        self.value_map[key] = node, value
Beispiel #2
0
 def __init__(self, size):
     if size < 1:
         raise ValueException('Value for cache size should be positive, '
                              'provided: {0}'.format(size))
     self.size = size
     self.value_map = {}
     self.recents = LinkedList()