在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python 中怎么來實現(xiàn)類似 Cache 的功能

科技綠洲 ? 來源:Python實用寶典 ? 作者:Python實用寶典 ? 2023-10-17 10:47 ? 次閱讀

cachetools,這是一個可擴(kuò)展的基于內(nèi)存的 Collections、Decorators 的封裝實現(xiàn)。

因為是 Cache,那么就一定有它的頁面置換算法。根據(jù)操作系統(tǒng)學(xué)過的一些知識,置換算法就會有 LRU、LFU、FIFO 等等。比如說,當(dāng) Cache 已經(jīng)滿了的情況下,如果這時候再插入一個新的數(shù)據(jù),那么這時候就需要根據(jù)頁面置換算法對已有的數(shù)據(jù)進(jìn)行置換,用新的數(shù)據(jù)替代舊的數(shù)據(jù),保證 Cache 最大占用量不會超標(biāo)。

廢話不多說了,這里我們來體驗下這個庫的具體用法吧。

首先是安裝,直接使用 pip3 安裝即可:

pip3 install cachetools

安裝好之后,我們再來看看它的具體用法。

基本 Cache 的使用

我們來看一個簡單的實例:

from cachetools import Cache

cache = Cache(maxsize=3)
cache['1'] = 'Hello'
cache['2'] = 'World'
print('current size', cache.currsize)
cache.pop('2')
print(cache.items)
print('length', len(cache))
cache['3'] = 'Hello'
cache['4'] = 'World'
print('current size', cache.currsize)
cache['5'] = 'Hello'
print('current size', cache.currsize)
print(cache.items)

運行結(jié)果如下:

current size 2
 bound method Mapping.items of Cache([('1', 'Hello')], maxsize=3, currsize=1) >
length 1
current size 3
current size 3
 bound method Mapping.items of Cache([('3', 'Hello'), ('4', 'World'), ('5', 'Hello')], maxsize=3, currsize=3) >

首先這里聲明了一個 Cache 對象,有一個必傳的參數(shù)是 maxsize,這里設(shè)置為 3,這里的 3 其實就是長度的意思,并不是實際內(nèi)存占用大小。

接著我們賦值了 1 和 2 兩個鍵名,接著打印出來了當(dāng)前 Cache 的大小,所以結(jié)果就是 2,這個 size 就是一個單純的數(shù)量值。

然后接著調(diào)用了 pop 方法移除了 2 對應(yīng)的內(nèi)容,然后打印 Cache 的所有內(nèi)容和對應(yīng)長度,理所應(yīng)當(dāng),長度就是 2,然后就剩下一個值。

接著我們又賦值了 3 和 4 兩個鍵名,然后打印了當(dāng)前 Cache 的大小,這會 Cache 達(dá)到了 maxsize,結(jié)果就是 3。

最后我們又賦值了 5 這個鍵名,然后打印了當(dāng)前 Cache 的大小和 Cache 的所有內(nèi)容,因為 Cache 已經(jīng)達(dá)到了 maxsize 了,所以結(jié)果依然是 3,最前面的 1 這個鍵名對應(yīng)的內(nèi)容就被移除了。

所以,這個 Cache 對象可以維持一個最大恒定大小,并且保證長度不會超過 maxsize。

其他 Cache 的使用

當(dāng)然除了 Cache,還有一些 Cache 的子類,比如說 FIFOCache、LFUCahce、LRUCache、MRUCache、RRCache,這里簡單說下:

  • FIFO:First In、First Out,就是先進(jìn)先出。
  • LFU:Least Frequently Used,就是淘汰最不常用的。
  • LRU:Least Recently Used,就是淘汰最久不用的。
  • MRU:Most Recently Used,與 LRU 相反,淘汰最近用的。
  • RR:Random Replacement,就是隨機(jī)替換。

具體的實例這里就不再講解了。

特殊 TTLCache 的使用

當(dāng)然除了基本的 Cache,cachetools 還提供了一種特殊的 Cache 實現(xiàn),叫做 TTLCache。

TTL 就是 time-to-live 的簡稱,也就是說,Cache 中的每個元素都是有過期時間的,如果超過了這個時間,那這個元素就會被自動銷毀。如果都沒過期并且 Cache 已經(jīng)滿了的話,那就會采用 LRU 置換算法來替換掉最久不用的,以此來保證數(shù)量。

下面我們來看一個樣例:

from datetime import timedelta, datetime
from cachetools import TTLCache
from time import sleep

cache = TTLCache(maxsize=3, ttl=timedelta(seconds=5), timer=datetime.now)
cache['1'] = 'Hello'
sleep(1)
cache['2'] = 'World'
print(cache.items)
sleep(4.5)
print(cache.items)
sleep(1)
print(cache.items)

運行結(jié)果如下:


這里我們聲明了一個 TTLCache,maxsize 是 3,然后 ttl 設(shè)置為了 5 秒,也就是說,每個元素 5 秒之后都會過期。

首先我們賦值 1 這個鍵名為 Hello,然后 1 秒之后賦值 2 這個鍵名為 World,接著將現(xiàn)有 Cache 的結(jié)果輸出出來。

接著等待 4.5 秒,這時候 1 這個鍵名就已經(jīng)超過 5 秒了,所以 1 這個鍵名理應(yīng)就被銷毀了。

接著再等待 1 秒,這時候 2 這個鍵名也超過 5 秒了,所以 2 這個鍵名也理應(yīng)就被銷毀了。

最后看運行結(jié)果也如我們期望的一樣。

大小計算

有的同學(xué)說,你這里 maxsize 用的這個數(shù)字指的是內(nèi)容的長度,但實際上不同的內(nèi)容占用的空間是完全不一樣的,有沒有根據(jù)實際內(nèi)存占用來計算 size 的方法呢?

有的!

這里我們只需要替換掉 Cache 的 getsizeof 方法即可。

這里我們需要額外引入一個庫,叫做 pympler,它提供了一個 asizeof 方法可以計算實際 Object 的占用內(nèi)存大小,單位是 bytes。

pympler 安裝:

pip3 install pympler

所以,如果我們要設(shè)置 Cache 占用的最大內(nèi)存大小,比如 2MB,那就可以這么設(shè)置:

from cachetools import Cache
from pympler import asizeof

cache = Cache(maxsize=2 * 1024 * 1024, getsizeof=asizeof.asizeof)
cache['a'] = '123'
print(cache.currsize)
cache['b'] = '123'
print(cache.currsize)
cache['c'] = '456'
print(cache.currsize)
cache['d'] = {
    'a': 'b',
    'b': 'c',
    'c': 'd'
}
print(cache.currsize)

這里 maxsize 我們就設(shè)置為了 2MB,同時 getsizeof 方法設(shè)置為了 pympler 的 asizeof 方法,這樣 Cache 在計算 size 的時候就會用 asizeof 方法了。

這里我們隨便插入一些數(shù)據(jù),看看實際的 size 變化,運行結(jié)果如下:

56
112
168
640

其結(jié)果就是 Cache 占用的字節(jié)數(shù)。可以看到數(shù)據(jù)的復(fù)雜度高,占用的空間越大。

更多

好了,其實到現(xiàn)在為止,基本的 Cache 和 TTLCache 就夠我們使用了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 封裝
    +關(guān)注

    關(guān)注

    128

    文章

    8580

    瀏覽量

    144960
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3115

    瀏覽量

    75054
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7109

    瀏覽量

    125097
  • Cache
    +關(guān)注

    關(guān)注

    0

    文章

    129

    瀏覽量

    28949
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4825

    瀏覽量

    86347
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    labview怎么實現(xiàn)類似PPT的超鏈接功能啊?

    labview怎么實現(xiàn)類似PPT的超鏈接功能啊?就是在主VI調(diào)用子VI后顯示子VI的界面,
    發(fā)表于 10-21 21:04

    5種Python實現(xiàn)方式詳解

    CPython擴(kuò)展的用戶來說,極力推薦Jython。IronPythonIronPython與Jython類似,所不同的是IronPython在CLR上實現(xiàn)Python,即面向.NET平臺,由C#編寫
    發(fā)表于 05-22 15:52

    請問Python如何實現(xiàn)vlookup函數(shù)的功能

    vlookup函數(shù)功能非常強(qiáng)大,那在Python如何實現(xiàn)
    發(fā)表于 11-06 06:11

    Python解釋器的基本結(jié)構(gòu)

    供足夠的上下文進(jìn)一步研究它。我們的目標(biāo)并不是解釋所有關(guān)于解釋器的知識——就像編程和計算機(jī)科學(xué)許多有趣的領(lǐng)域一樣,您可以花費數(shù)年時間深入理解這個主題。Byterun它的結(jié)構(gòu)類似
    發(fā)表于 09-16 06:42

    CacheTag電路的設(shè)計

    摘要:在SoC系統(tǒng),片上緩存(Cache)的采用是解決片上處理器和片外存儲器之間速度差異的重要方法,Cache中用來存儲標(biāo)記位并判斷Cache是否命中的Tag電路的設(shè)計將會影響到整個
    發(fā)表于 05-08 09:26 ?11次下載

    Python語言在人工智能功能及優(yōu)勢

    其他語言制作的各種模塊輕松地聯(lián)結(jié)在一起。本文主要詳解Python語言在人工智能功能及優(yōu)勢,具體的跟隨小編詳細(xì)的了解一下。
    發(fā)表于 05-22 14:29 ?1.2w次閱讀

    cache結(jié)構(gòu)與工作原理

    更詳細(xì)的講,cache的結(jié)構(gòu)其實和內(nèi)存的結(jié)構(gòu)類似,也包含地址和內(nèi)容,只是cache的內(nèi)容除了存的數(shù)據(jù)(data)之外,還包含存的數(shù)據(jù)的物理內(nèi)存的地址信息(tag),因為CPU發(fā)出的尋址信息都是針對
    發(fā)表于 06-03 14:24 ?1.3w次閱讀
    <b class='flag-5'>cache</b>結(jié)構(gòu)與工作原理

    jsonpath庫的常規(guī)功能介紹

    Python我們可以使用jsonpath這個庫實現(xiàn)JSONPath的功能。 2 在Python
    的頭像 發(fā)表于 09-01 14:11 ?2263次閱讀
    jsonpath庫<b class='flag-5'>中</b>的常規(guī)<b class='flag-5'>功能</b>介紹

    Buffer與cache的區(qū)別

    Bbuffer 與 Cache 非常類似,因為它們都用于存儲數(shù)據(jù)數(shù)據(jù),被應(yīng)用層讀取字節(jié)數(shù)據(jù)。
    的頭像 發(fā)表于 07-01 10:44 ?4352次閱讀

    抽樣在Python是如何實現(xiàn)

    今天和大家聊聊抽樣的幾種常用方法,以及在Python是如何實現(xiàn)的。
    的頭像 發(fā)表于 08-05 10:59 ?1440次閱讀

    如何用Python實現(xiàn)文件系統(tǒng)的操作功能

    就來介紹一下如何用 Python 實現(xiàn)這些功能 輸出當(dāng)前的路徑 我們可以通過 Python 當(dāng)中的 OS 庫
    的頭像 發(fā)表于 10-30 14:27 ?612次閱讀
    如何用<b class='flag-5'>Python</b><b class='flag-5'>來</b><b class='flag-5'>實現(xiàn)</b>文件系統(tǒng)的操作<b class='flag-5'>功能</b>

    Cache內(nèi)容鎖定是什么

    “鎖定”在cache的塊在常規(guī)的cache替換操作不會被替換,但當(dāng)通過C7控制cache
    的頭像 發(fā)表于 10-31 11:31 ?1048次閱讀

    怎么在Python實現(xiàn)截圖功能

    操作。 今天Python實用寶典就來講講怎么在Python實現(xiàn)截圖功能,以下教程默認(rèn)您已經(jīng)安裝好了Py
    的頭像 發(fā)表于 11-03 15:32 ?1300次閱讀
    怎么在<b class='flag-5'>Python</b><b class='flag-5'>中</b><b class='flag-5'>實現(xiàn)</b>截圖<b class='flag-5'>功能</b>

    C++實現(xiàn)類似instanceof的方法

    函數(shù),可實際上C++沒有。但是別著急,其實C++中有兩種簡單的方法可以實現(xiàn)類似Java的instanceof的功能。 在 C++
    的頭像 發(fā)表于 07-18 10:16 ?883次閱讀
    C++<b class='flag-5'>中</b><b class='flag-5'>實現(xiàn)</b><b class='flag-5'>類似</b>instanceof的方法

    如何實現(xiàn)Python復(fù)制文件操作

    Python 中有許多“開蓋即食”的模塊(比如 os,subprocess 和 shutil)以支持文件 I/O 操作。在這篇文章,你將會看到一些用 Python 實現(xiàn)文件復(fù)制的特殊
    的頭像 發(fā)表于 07-18 14:53 ?730次閱讀
    主站蜘蛛池模板: 人人看人人做 | 午夜美女影院 | 欧美午夜大片 | va在线 | 天天噜天天射 | aaa亚洲 | 日本人视频-jlzz jlzz jlzz | 香蕉视频黄色在线观看 | 亚洲欧洲综合网 | 日本人xxxxxxxxx69 | 亚洲第一黄色网址 | 26uuu另类亚洲欧美日本一 | 一级黄色大全 | 成人黄网大全在线观看 | 在线观看日本免费视频大片一区 | 可以直接看的黄址 | 国产福利小视频在线观看 | 免费看黄的视频网站 | caopon在线| 四虎影院精品在线观看 | 在线看片地址 | 色黄网站成年女人色毛片 | 免费国产午夜高清在线视频 | 色综合久久九月婷婷色综合 | 欧美一级别 | 天天摸夜夜摸夜夜狠狠摸 | 色综合久久久久久久久五月 | 亚洲四虎影院 | 一级aaa毛片 | 色多多免费观看 | 午夜精品久久久久蜜桃 | 免费看国产一级特黄aa大片 | 亚洲国产精品综合久久网络 | 国产精品久久久亚洲456 | 日本三级网站在线观看 | 国产午夜a理论毛片在线影院 | 五月婷婷六月丁香综合 | 亚洲色图图片区 | 欧美影院入口 | 黄h视频在线观看视频 | 国产免费一级高清淫日本片 |