Skip to content

Instantly share code, notes, and snippets.

@newnewcoder
Created December 9, 2018 09:28
Show Gist options
  • Save newnewcoder/b869f3cd302efdf5aa7949949a34ccab to your computer and use it in GitHub Desktop.
Save newnewcoder/b869f3cd302efdf5aa7949949a34ccab to your computer and use it in GitHub Desktop.
learn simple LRU

LRU Cache 學習

LRU是在一個有限大小的快取空間,保持最近使用過的資料的一種快取機制,可以透過getter、setter方法搭配一個有序字典物件來實現

import collections


class LRUCache(object):
    """ Simple LRU Cache
    """
    
    def __init__(self, size=10):
        """ 實例化時可透過size參數設定cache大小
        """
        self.size = size
        self._dict = collections.OrderedDict()

    def __contains__(self, key):
        """ 讓cache可以使用 in 來確認key值是否存在
        """
        return key in self._dict

    def __getitem__(self, key):
        """ 讓cache可以使用value = cache[key]的方式取值
        """
        return self.get(key)

    def __setitem__(self, key, value):
        """ 讓cache可以使用cache[key] = value的方式設值
        """
        return self.set(key, value)
        
    def get(self, key):
        """ 取值。
            如果要取得的key已經在字典中,則將該值移動到最新的位置,如果沒有就回傳None
        """
        if key in self._dict:
            value = self._dict.pop(key)
            self._dict[key] = value
            return value
        return None
    
    def set(self, key, value):
        """ 設值。
            如果該key已經存在cache中,則更新值,並調整位置至最新。
            如果該key尚未在cache中,則先確定cache長度是否已經到達長度限制,
            若已經達到長度限制的話則將最舊一筆資料剔除,再新增新值,
            否則直接新增值
        """
        try:
            self._dict.pop(key)
        except KeyError:
            if len(self._dict) >= self.size:
                self._dict.popitem(last=False)
        self._dict[key] = value
        
    def keys(self):
        return self._dict.keys()
@newnewcoder
Copy link
Author

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment