成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python開發:緩存機制介紹

譯文
移動開發
緩存是一種將定量數據加以保存以備迎合后續請求的處理方式,旨在加快數據的檢索速度。在今天的文章中,我們將一同從簡單示例出發,了解如何使用緩存機制。

【51CTO快譯】在今天的文章中,我們將一同從簡單示例出發,了解如何使用緩存機制。在此之后,我們將進一步利用Python標準庫的functools模塊創建適合自己需要的緩存。閑言少敘,馬上開始。

緩存是一種將定量數據加以保存以備迎合后續請求的處理方式,旨在加快數據的檢索速度。在今天的文章中,我們將一同從簡單示例出發,了解如何使用緩存機制。在此之后,我們將進一步利用Python標準庫的functools模塊創建適合自己需要的緩存。作為起步工作,我們首先創建一個類,用于構建我們的緩存字典,而后根據需要進行擴展。以下為具體代碼:

  1. ######################################################################## 
  2.  
  3. class MyCache: 
  4.  
  5.     """""" 
  6.  
  7.     #---------------------------------------------------------------------- 
  8.  
  9.     def __init__(self): 
  10.  
  11.         """Constructor""" 
  12.  
  13.         self.cache = {} 
  14.  
  15.         self.max_cache_size = 10 

在以上類示例中沒有包含什么特別之處。我們只是創建一個簡單類,同時設置兩個類變量或者說屬性,即cahce與max_cache_size。其中cache屬于一套空字典,而max_cache_size顯然代表著***緩存容量。下面讓我們進一步充實該代碼,使其具備一定功能:

  1. import datetime 
  2.  
  3. import random 
  4.  
  5. ######################################################################## 
  6.  
  7. class MyCache: 
  8.  
  9.     """""" 
  10.  
  11.     #---------------------------------------------------------------------- 
  12.  
  13.     def __init__(self): 
  14.  
  15.         """Constructor""" 
  16.  
  17.         self.cache = {} 
  18.  
  19.         self.max_cache_size = 10 
  20.  
  21.     #---------------------------------------------------------------------- 
  22.  
  23.     def __contains__(self, key): 
  24.  
  25.         """ 
  26.  
  27.         根據該鍵是否存在于緩存當中返回True或者False 
  28.  
  29.         """ 
  30.  
  31.         return key in self.cache 
  32.  
  33.     #---------------------------------------------------------------------- 
  34.  
  35.     def update(self, key, value): 
  36.  
  37.         """ 
  38.  
  39.         更新該緩存字典,您可選擇性刪除最早條目 
  40.  
  41.         """ 
  42.  
  43.         if key not in self.cache and len(self.cache) >= self.max_cache_size: 
  44.  
  45.             self.remove_oldest() 
  46.  
  47.         self.cache[key] = {'date_accessed': datetime.datetime.now(), 
  48.  
  49.                            'value': value} 
  50.  
  51.     #---------------------------------------------------------------------- 
  52.  
  53.     def remove_oldest(self): 
  54.  
  55.         """ 
  56.  
  57.         刪除具備最早訪問日期的輸入數據 
  58.  
  59.         """ 
  60.  
  61.         oldest_entry = None 
  62.  
  63.         for key in self.cache: 
  64.  
  65.             if oldest_entry == None
  66.  
  67.                 oldest_entry = key 
  68.  
  69.             elif self.cache[key]['date_accessed'] < self.cache[oldest_entry][ 
  70.  
  71.                 'date_accessed']: 
  72.  
  73.                 oldest_entry = key 
  74.  
  75.         self.cache.pop(oldest_entry) 
  76.  
  77.     #---------------------------------------------------------------------- 
  78.  
  79.     @property 
  80.  
  81.     def size(self): 
  82.  
  83.         """ 
  84.  
  85.         返回緩存容量大小 
  86.  
  87.         """ 
  88.  
  89.         return len(self.cache) 

在這里,我們導入了datetime與random模塊,而后我們即可看到之前創建完成的類。這一次,我們向其中添加幾種方法。其中一種方法具備神奇的效果,名為_contains_。雖然在這里并不一定要使用該方法,但其基本思路在于允許我們檢查該類實例,從而了解其中是否包含有我們正在尋找的鍵。另外,update方法負責利用新的鍵/值對進行緩存字典更新。一旦達到或者超出緩存***容量,其還會刪除日期最早的輸入數據。另外,remove_oldest方法負責具體的字典內早期數據刪除工作。***,我們還引入了名為size的屬性,其能夠返回緩存的具體容量。

在添加了以下代碼之后,我們就能夠測試該緩存是否按預期起效:

  1. if __name__ == '__main__'
  2.  
  3.     #測試緩存 
  4.  
  5.     keys = ['test''red''fox''fence''junk'
  6.  
  7.             'other''alpha''bravo''cal''devo'
  8.  
  9.             'ele'
  10.  
  11.     s = 'abcdefghijklmnop' 
  12.  
  13.     cache = MyCache() 
  14.  
  15.     for i, key in enumerate(keys): 
  16.  
  17.         if key in cache: 
  18.  
  19.             continue 
  20.  
  21.         else
  22.  
  23.             value = ''.join([random.choice(s) for i in range(20)]) 
  24.  
  25.             cache.update(key, value) 
  26.  
  27.         print("#%s iterations, #%s cached entries" % (i+1, cache.size)) 
  28.  
  29.     print 

在本示例當中,我們設置了大量預定義鍵與循環。如果鍵尚不存在,我們會將其添加到緩存當中。不過以上示例代碼并沒有提到如何更新訪問日期,感興趣的朋友們可以將其作為練習自行探索。在運行這段代碼之后,大家會注意到當緩存被占滿時,其會正確刪除時間更早的條目。

現在,我們繼續前進,看看如何利用另一種方式使用Python的內置functools模塊創建緩存。

使用functools.lru_cache

Python的functools模塊提供一種非常實用的裝飾器,即lru_cache。需要注意的是,其在3.2版本當中才被添加進來。根據說明文檔所言,該裝飾器能夠“利用可調用內存對函數進行打包,從而削減最近調用的***尺寸。”接下來,我們將根據說明文檔中提到的示例編寫一項基本功能,其中包含多個網絡頁面。在這種情況下,我們可以直接從Python說明文檔站點處獲取頁面。

  1. import urllib.error 
  2.  
  3. import urllib.request 
  4.  
  5. from functools import lru_cache 
  6.  
  7. @lru_cache(maxsize=24
  8.  
  9. def get_webpage(module): 
  10.  
  11.     """ 
  12.  
  13.     獲取特定Python模塊網絡頁面 
  14.  
  15.     """     
  16.  
  17.     webpage = "https://docs.python.org/3/library/{}.html".format(module) 
  18.  
  19.     try
  20.  
  21.         with urllib.request.urlopen(webpage) as request: 
  22.  
  23.             return request.read() 
  24.  
  25.     except urllib.error.HTTPError: 
  26.  
  27.         return None 
  28.  
  29. if __name__ == '__main__'
  30.  
  31.     modules = ['functools''collections''os''sys'
  32.  
  33.     for module in modules: 
  34.  
  35.         page = get_webpage(module) 
  36.  
  37.         if page: 
  38.  
  39.             print("{} module page found".format(module)) 

在以上代碼當中,我們利用lru_cache對get_webpage函數進行了裝飾,并將其***尺寸設置為24條調用。在此之后,我們設置了一條網頁字符串變量,并將其傳遞至我們希望函數獲取的模塊當中。根據我的個人經驗,如果大家將其運行在某種Python解釋器當中——例如IDLE——那么效果會更好。如此一來,我們就能夠針對該函數運行多次循環。可以看到在***運行上述代碼時,輸出結果的顯示速度相對比較慢。但如果大家在同一會話中再次加以運行,那么其顯示速度將極大加快——這意味著lru_cache已經正確對該調用進行了緩存處理。大家可以在自己的解釋器實例當中進行試驗并親自查看結果。

另外,我們還可以將一條typed參數傳遞至該裝飾器。其屬于一條Boolean,旨在通知該裝飾器在typed為設定為True時對不同類型參數進行分別緩存。

總結

現在大家已經初步了解了如何利用Python編寫自己的緩存機制。這是一款有趣的工具,而且能夠在各位面對大量高強度I/O調用或者希望對登錄憑證等常用信息進行緩存時發揮重要作用。

原文標題:Python開發:緩存機制介紹

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】

責任編輯:李英杰 來源: 51CTO
相關推薦

2009-11-09 17:55:13

WCF緩存

2012-02-01 13:57:40

內存緩存機制

2016-01-05 12:54:52

瀏覽器瀏覽器端緩存

2009-06-17 15:43:03

Hibernate緩存

2023-02-24 16:46:25

Glide緩存機制

2024-11-21 12:00:00

字典緩存Python

2010-10-13 16:44:10

MySQL查詢緩存機制

2025-01-02 14:50:34

MyBatis開發緩存

2018-08-07 10:44:50

緩存技術瀏覽器

2011-11-30 14:35:19

JavaSPI

2011-07-11 10:00:34

PHP緩存技術

2009-08-17 16:48:34

ASP.NET緩存機制

2009-08-04 15:22:33

ASP.NET緩存機制

2024-12-23 06:40:00

2010-11-25 09:37:14

MySQL查詢緩存機制

2009-08-13 16:57:37

.NET緩存機制

2019-08-08 15:47:03

HTTP緩存CDN

2017-04-26 14:15:35

瀏覽器緩存機制

2009-11-23 17:56:44

PHP緩存機制

2009-06-18 14:51:12

Hibernate緩存Hibernate
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产欧美在线 | 欧美日韩网站 | 国产美女在线播放 | 国产精品视频一二三 | 国产精品jizz在线观看老狼 | 午夜精品久久久久久 | 欧美日韩国产一区二区三区 | 精品久久久久久久久久久下田 | 91精品久久久久 | 久久久久国产精品一区 | 色资源在线视频 | 国产激情在线 | 一区二区三区电影在线观看 | 妖精视频一区二区三区 | 欧美a级成人淫片免费看 | 亚洲精品av在线 | 黄网站在线播放 | 先锋资源亚洲 | 精品视频一区二区三区四区 | 日韩欧美理论片 | 在线日韩欧美 | 国产精品一区二区三 | 人操人人 | 色偷偷噜噜噜亚洲男人 | 欧美成人激情 | 久久久久国产 | 亚洲欧美网站 | 99只有精品 | 成人一级黄色毛片 | 日韩精品在线视频 | japan21xxxxhd美女 日本欧美国产在线 | 免费一二区 | 亚洲精品国产电影 | 日本不卡一区二区三区在线观看 | 欧美一级在线 | 青青草av在线播放 | 91精品国产综合久久婷婷香蕉 | 欧洲一区二区在线 | 午夜久久久久久久久久一区二区 | 国产日韩欧美 | 日本久久综合网 |