欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)現(xiàn)的一個(gè)簡(jiǎn)單LRU cache

 更新時(shí)間:2014年09月26日 12:03:05   投稿:junjie  
這篇文章主要介紹了Python實(shí)現(xiàn)的一個(gè)簡(jiǎn)單LRU cache,本文根據(jù)實(shí)際需求總結(jié)而來(lái),需要的朋友可以參考下

起因:我的同事需要一個(gè)固定大小的cache,如果記錄在cache中,直接從cache中讀取,否則從數(shù)據(jù)庫(kù)中讀取。python的dict 是一個(gè)非常簡(jiǎn)單的cache,但是由于數(shù)據(jù)量很大,內(nèi)存很可能增長(zhǎng)的過大,因此需要限定記錄數(shù),并用LRU算法丟棄舊記錄。key 是整型,value是10KB左右的python對(duì)象

分析:

1)可以想到,在對(duì)于cache,我們需要維護(hù) key -> value 的關(guān)系

2)而為了實(shí)現(xiàn)LRU,我們又需要一個(gè)基于時(shí)間的優(yōu)先級(jí)隊(duì)列,來(lái)維護(hù)   timestamp  -> (key, value) 的關(guān)系

3)當(dāng)cache 中的記錄數(shù)達(dá)到一個(gè)上界maxsize時(shí),需要將timestamp 最小的(key,value) 出隊(duì)列

4) 當(dāng)一個(gè)(key, value) 被命中時(shí),實(shí)際上我們需要將它從隊(duì)列中,移除并插入到隊(duì)列的尾部。

從分析可以看出我們的cache 要達(dá)到性能最優(yōu)需要滿足上面的四項(xiàng)功能,對(duì)于隊(duì)表的快速移除和插入,鏈表顯然是最優(yōu)的選擇,為了快速移除,最好使用雙向鏈表,為了插入尾部,需要有指向尾部的指針。

下面用python 來(lái)實(shí)現(xiàn):

復(fù)制代碼 代碼如下:

#encoding=utf-8

class LRUCache(object):
    def __init__(self, maxsize):
        # cache 的最大記錄數(shù)
        self.maxsize = maxsize
        # 用于真實(shí)的存儲(chǔ)數(shù)據(jù)
        self.inner_dd = {}
        # 鏈表-頭指針
        self.head = None
        # 鏈表-尾指針
        self.tail = None

    def set(self, key, value):
        # 達(dá)到指定大小     
        if len(self.inner_dd) >= self.maxsize:
            self.remove_head_node()

        node = Node()
        node.data = (key, value)
        self.insert_to_tail(node)
        self.inner_dd[key] = node

    def insert_to_tail(self, node):
        if self.tail is None:
            self.tail = node
            self.head = node
        else:
            self.tail.next = node
            node.pre = self.tail
            self.tail = node

    def remove_head_node(self):
        node = self.head
        del self.inner_dd[node.data[0]]
        node = None
        self.head = self.head.next
        self.head.pre = None
    def get(self, key):
        if key in self.inner_dd:
            # 如果命中, 需要將對(duì)應(yīng)的節(jié)點(diǎn)移動(dòng)到隊(duì)列的尾部
            node = self.inner_dd.get(key)
            self.move_to_tail(node)
            return node.data[1]
        return None

    def move_to_tail(self, node):
        # 只需處理在隊(duì)列頭部和中間的情況
        if not (node == self.tail):
            if node == self.head:
                self.head = node.next
                self.head.pre = None
                self.tail.next = node
                node.pre = self.tail
                node.next = None
                self.tail = node
            else:
                pre_node = node.pre
                next_node = node.next
                pre_node.next = next_node
                next_node.pre = pre_node

                self.tail.next = node
                node.pre = self.tail
                node.next = None
                self.tail = node

class Node(object):
    def __init__(self):
        self.pre = None
        self.next = None
        # (key, value)
        self.data = None

    def __eq__(self, other):
        if self.data[0] == other.data[0]:
            return True
        return False
    def __str__(self):
       return str(self.data)

if __name__ == '__main__':
    cache = LRUCache(10)
    for i in xrange(1000):
        cache.set(i, i+1)
        cache.get(2)
    for key in cache.inner_dd:
        print key, cache.inner_dd[key]

您可能感興趣的文章:

相關(guān)文章

  • 利用scikitlearn畫ROC曲線實(shí)例

    利用scikitlearn畫ROC曲線實(shí)例

    這篇文章主要介紹了利用scikitlearn畫ROC曲線實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-07-07
  • python?pdb調(diào)試器及使用方法

    python?pdb調(diào)試器及使用方法

    這篇文章主要介紹了python?pdb調(diào)試器及使用方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 使用批處理腳本自動(dòng)生成并上傳NuGet包(操作方法)

    使用批處理腳本自動(dòng)生成并上傳NuGet包(操作方法)

    這篇文章主要介紹了使用批處理腳本自動(dòng)生成并上傳NuGet包的操作方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • python使用多線程備份數(shù)據(jù)庫(kù)的步驟

    python使用多線程備份數(shù)據(jù)庫(kù)的步驟

    在日常服務(wù)器運(yùn)維工作中,備份數(shù)據(jù)庫(kù)是必不可少的,剛工作那會(huì)看到公司都是用shell腳本循環(huán)備份數(shù)據(jù)庫(kù),到現(xiàn)在自己學(xué)習(xí)python語(yǔ)言后,利用多進(jìn)程多線程相關(guān)技術(shù)來(lái)實(shí)現(xiàn)并行備份數(shù)據(jù)庫(kù),充分利用服務(wù)器資源,提高備份速度。
    2021-05-05
  • python使用append合并兩個(gè)數(shù)組的方法

    python使用append合并兩個(gè)數(shù)組的方法

    這篇文章主要介紹了python使用append合并兩個(gè)數(shù)組的方法,涉及Python中append方法的使用技巧,需要的朋友可以參考下
    2015-04-04
  • 16行Python代碼實(shí)現(xiàn)微信聊天機(jī)器人并自動(dòng)智能回復(fù)功能

    16行Python代碼實(shí)現(xiàn)微信聊天機(jī)器人并自動(dòng)智能回復(fù)功能

    聊天機(jī)器人自動(dòng)智能回復(fù)給我們的生活帶來(lái)了極大的便利,尤其在業(yè)務(wù)比較繁忙的時(shí)候,智能機(jī)器人給我們帶來(lái)極大的方便,今天小編教大家一招通過16行代碼實(shí)現(xiàn)微信聊天智能機(jī)器人,感興趣的朋友一起看看吧
    2022-01-01
  • python 爬蟲一鍵爬取 淘寶天貓寶貝頁(yè)面主圖顏色圖和詳情圖的教程

    python 爬蟲一鍵爬取 淘寶天貓寶貝頁(yè)面主圖顏色圖和詳情圖的教程

    今天小編就為大家分享一篇python 爬蟲一鍵爬取 淘寶天貓寶貝頁(yè)面主圖顏色圖和詳情圖的教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-05-05
  • Python實(shí)現(xiàn)多個(gè)圓和圓中圓的檢測(cè)

    Python實(shí)現(xiàn)多個(gè)圓和圓中圓的檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)多個(gè)圓檢測(cè)和圓中圓的檢測(cè),文中的實(shí)現(xiàn)方法講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2022-11-11
  • pandas如何將datetime64[ns]轉(zhuǎn)為字符串日期

    pandas如何將datetime64[ns]轉(zhuǎn)為字符串日期

    這篇文章主要介紹了pandas如何將datetime64[ns]轉(zhuǎn)為字符串日期,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • python實(shí)現(xiàn)mask矩陣示例(根據(jù)列表所給元素)

    python實(shí)現(xiàn)mask矩陣示例(根據(jù)列表所給元素)

    這篇文章主要介紹了python實(shí)現(xiàn)mask矩陣示例(根據(jù)列表所給元素),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評(píng)論