面試不再怕,程式設計師大佬教你20行Python代碼,搞懂LRU算法

2020-12-03 韓語學習資訊

LRU算法在後端工程師面試中,是一個比較常出現的題目,這篇文章帶大家一起,理解LRU算法,並最終用Python輕鬆實現一個基於LRU算法的緩存。

緩存是什麼

先看一張圖,當我們訪問網頁,瀏覽器會給伺服器發請求,伺服器會經過一系列的運算,把頁面返回給瀏覽器。

當有多個瀏覽器同時訪問的時候,就會在短時間內發起多個請求,而伺服器對每一個請求都要進行一系列相同的操作。重複工作不僅浪費資源,還可能導致響應速度變慢。

而緩存則可以把伺服器返回的頁面保存下來,當有其他的瀏覽器再訪問時候,就不必勞伺服器大駕,直接由緩存返回頁面。為了保證響應速度,緩存通常是基於比較昂貴的硬體,比如RAM,這就決定了我們很難用大量的緩存把所有的頁面都存下來,當恰好沒有緩存瀏覽器請求的頁面時,依然需要請求伺服器。由於緩存容量有限,而數據量無限(網際網路每天新產生的頁面數無法估計),就需要把好剛用在刀刃上,緩存那些最有用的信息。

LRU是什麼

LRU是一種緩存淘汰算法(在OS中也叫內存換頁算法),由於緩存空間是有限的,所以要淘汰緩存中不常用的數據,留下常用的數據,達到緩存效率的最大化。LRU就是這樣一種決定「淘汰誰留下誰」的算法,LRU是Least recently used的縮寫,從字面意思「最近最少使用」,我們就可以理解LRU的淘汰規則。

LRU的淘汰邏輯

我們用一張圖來描述LRU的淘汰邏輯,圖中的緩存是一個列表結構,上面是頭結點下面是尾節點,緩存容量為8(8個小格子):

有新數據(意味著數據之前沒有被緩存過)時,加入到列表頭緩存到達最大容量時,需要淘汰數據多出來的數據,此時淘汰列表尾部的數據當緩存中有數據被命中,則將數據移動到列表頭部(相當於新加入緩存)按上面的邏輯我們可以看到,一個數據如果經常被訪問就會不斷地被移動到列表頭部,不會被淘汰出緩存,而越不經常訪問的數據,越容易被擠出緩存。

對想學習Python的小夥伴,小編給你們準備了全套Python電子版書籍,包含了目前大部分Python軟體開發的書領取方式,先關注小編,然後私信「Python」,就能獲取全套書籍,你還不心動嗎?心動就趕緊發私信 ,獲取資源還有一個交流學習的好地方

【私信方法】文章上方處點擊「作者頭像」,進入作者首頁,右上角點擊「發私信」 即可

20行Python代碼實踐LRU

接下來我們用Python來實現一個採用LRU算法的緩存。

從前面的文章中我們可以知道,緩存簡化下來就兩個功能,一個是往裡裝數據(緩存數據),一個是往外吐數據(命中緩存),所以我們的緩存對外只需要put和get兩個接口就可以了。

按照前面的示意圖,緩存內部我們只需要有一個列表(list)就可以實現LRU邏輯,不過用列表雖然能實現邏輯,但是在判斷是否命中緩存時,速度可能非常慢(列表需要遍歷才能知道數據有沒有在裡面)。在Python中,我們可以用基於hash的結構,比如字典(dict)或集合(set),來快速判斷數據是否存在,解決列表實現的性能問題。但是字典和集合又是沒有順序的,如果能有一種既能排序,又是基於hash存儲的數據結構,就好了。

在Python的collections包中,已經內置了這種實用的結構OrderedDict,OrderedDict是dict的子類,但是存儲在內部的元素是有序的(列表的特點)。

解決了數據結構的問題,我們可以直接上手寫邏輯了,代碼如下:

class LRUCache:def __init__(self, capacity): self.capacity = capacity self.queue = collections.OrderedDict() def get(self, key): if key not in self.queue: return -1 // 要找的數據不在緩存中返回-1 value = self.queue.pop(key) // 將命中緩存的數據移除 self.queue[key] = value // 將命中緩存的數據重新添加到頭部 return self.queue[key] def put(self, key, value): if key in self.queue: // 如果已經在緩存中,則先移除老的數據 self.queue.pop(key) elif len(self.queue.items()) == self.capacity: self.queue.popitem(last=False) // 如果不在緩存中並且到達最大容量,則把最後的數據淘汰 self.queue[key] = value // 將新數據添加到頭部

下次面試在遇到LRU的題目,是不是就胸有成竹了?

喜歡這篇文章,歡迎關注小編

相關焦點

  • 《Python程式設計師面試算法寶典》PDF超清版開源了文末附下載方式
    、分類歸納,提煉出算法面試的各種應對技巧,是一本Python程式設計師算法面試的圖書寶典。全面介紹Python程式設計師面試筆試技巧和方法,教你如何以「不變應萬變」。√ 兩萬多行代碼,100多個知識點,全面覆蓋Python程式設計師各類面試題型。√ 15年開發經驗、實戰技巧總結,站在「巨人」的肩膀上,讓學習走捷徑。
  • 代碼跑得慢甩鍋Python?手把手教你如何給代碼提速30%
    大數據文摘出品來源:Medium編譯:王轉轉Python已經得到了全球程式設計師的喜愛,但是還是遭到一些人的詬病,原因之一就是認為它運行緩慢。其實某個特定程序(無論使用何種程式語言)的運行速度是快還是慢,在很大程度上取決於編寫該程序的開發人員自身素質,以及他們編寫優化而高效代碼的能力。
  • 地鐵五分鐘理解LRU算法
    LRU(Least recently used,最近最少使用)算法作為內存管理的一種有效算法,其含義是在內存有限的情況下,當內存容量不足時,為了保證程序的運行,這時就不得不淘汰內存中的一些對象,釋放這些對象佔用的空間,那麼選擇淘汰哪些對象呢?
  • 10行Python代碼也能實現,親測好用!
    大數據文摘出品編譯:朱一輝、雪清、小魚短短10行代碼就可以實現目標檢測?!本文作者和他的團隊構建了一個名為ImageAI 的Python庫,集成了現今流行的深度學習框架和計算機視覺庫。本文將手把手教你構建自己的第一個目標檢測應用,而且文摘菌已經幫你踩過坑了,親測有效!
  • 程式設計師面試通關的 101 道真題
    在程式設計師的職業生涯中,無論是在跳槽時還是晉升時都會遇到各式各樣的面試,那麼就技術層面上而言,面試有哪些寶典秘籍可供參考,希望本文的 101 道真題能給你幫助。作者 | javinpaul,Java程式設計師譯者 | 彎月,責編 | 屠敏以下為譯文:對程式設計師來說,編程面試有著非凡的意義。
  • 程式設計師的樂趣,生成自定義二維碼,5行Python代碼就搞定
    近日,一位熱衷於終身學習的工程師兼攝影師 Arindom Bhattacharjee 撰寫了一篇自定義生成二維碼的方法,並且整個生成過程只需要 5 行 Python 代碼即可完成。感興趣的讀者可以自己實現下。5 行 Python 代碼自定義生成二維碼二維碼(QR Code)由白色背景上的黑色網格方塊組成。
  • Python趣味打怪:60秒學會一個例子,147段代碼助你從入門到大師
    不要害怕學習的過程枯燥無味,這裡有程式設計師jackzhenguo打造的一份中文Python「糖果包」:147個代碼小樣,60秒一口,營養又好玩,從Python基礎到機器學習盡皆囊括。入門簡單如十進位轉二進位,盡顯Python簡潔之美:In [1]: bin(10)Out[1]: '0b1010'冬天到了,就算沒有點亮手繪技能,也能用簡單幾行代碼繪出漫天雪花:
  • 好程式設計師Python培訓分享numpy簡介
    好程式設計師Python培訓分享numpy簡介:一、numpy簡介:NumPy是一個功能強大的Python庫,主要用於對多維數組執行計算。NumPy這個詞來源於兩個單詞-- Numerical和Python。NumPy提供了大量的庫函數和操作,可以幫助程式設計師輕鬆地進行數值計算。
  • Python程式設計師最常犯的10個錯誤,你中招了嗎?
    如果想更深入了解Python的類特性,請戳:https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide常見錯誤3:錯誤指定異常代碼塊的參數假設你有如下代碼:
  • 資深程式設計師大佬告訴你,如何成為一個C++高級程式設計師
    GUI想要學習交流C/C++,可以私信小編 發C++ 獲取資源和一個程式設計師交流圈。3. 數據結構和算法很多人都忽視了數據結構和算法方面的知識,尤其是一些程式語言的庫做得非常好,幾乎不需要自己去實現一些數據結構和算法,導致現在很多程式設計師不 重視甚至忽略這方面的知識。但是,當我們想讓我們的程序跑的更快、內存佔用更少的時候,這些知識就非常非常重要了。
  • 高級程式設計師是如何從初級程式設計師演變的?工作經驗不再是唯一途徑!
    區分高級和初級程式設計師的標準是工作年限嗎?程式設計師最重要的工作就是寫代碼嗎? 高級程式設計師是一名犯過其領域內所有可能犯到的錯誤的專家。在工作的那些年裡你到底獲得了多少經驗和技能?這正是面對開發人員的求職和面試如此複雜的原因。度量技能是很困難的,所以我們在面試中給開發人員進行了很多有難度的測試。但這些測試充其量也只是了解一個大概,無法度量其究竟具備多少完成該項工作所需的經驗或專業技能。 這就引出了下一個問題。
  • Python 爬蟲面試題 170 道
    最近在刷面試題,所以需要看大量的 Python 相關的面試題,從大量的題目中總結了很多的知識,同時也對一些題目進行拓展了,但是在看了網上的大部分面試題都有這幾個問題:有些部分還是 Python2 的代碼回答的很簡單,關鍵的題目沒有點出為什麼
  • 以及訂閱模式、LRU
    主要的實現代碼如下。內存淘汰策略的配置如下:# 最大使用內存 maxmemory 5m# 內存淘汰策略 The default is:noeviction maxmemory-policy allkeys-lruLRU算法LRU算法的實現,其實可以靠一個鍊表。鍊表按照使用情況來進行排序,當空間不足時,會剔除掉尾部的數據。當某個元素被訪問時它會被移動到鍊表頭。
  • 能寫出這種代碼的程式設計師都是神仙吧!
    源 / 頂級程式設計師    文 / An先生或許在大多數人眼中,敲代碼是件乏味枯燥的事。但,並不是!
  • Python代碼性能調試和優化
    找出程序中影響程序性能的代碼。.prec -= 2return +sprint(exp(Decimal(150)))print(exp(Decimal(400)))print(exp(Decimal(3000)))最簡單的調試最簡單且實用的調試性能調試的方法是使用Linux的time命令,time可以計算程序執行的時間:time python3
  • Linux 之父拒絕 996,Swift、Python 之父痴迷深夜編程,程式設計師之神...
    【CSDN編者按】程式設計師大佬們都是什麼時候敲代碼呢?熬夜到天明嗎?下面這篇文章是關於各個程式設計師大佬們的代碼提交時間圖表。讓我們一睹為快吧。作者 | Ivan Bessarabov譯者 | 胡雪蕊,責編 | 胡巍巍以下為譯文:我非常好奇著名的程式設計師在什麼時候工作。這是很容易找到答案的。程式設計師工作的結果就是代碼。
  • Python 爬蟲面試題 170 道:2019 版
    引言最近在刷面試題,所以需要看大量的 Python 相關的面試題,從大量的題目中總結了很多的知識,同時也對一些題目進行拓展了,但是在看了網上的大部分面試題不是很滿意。大概就這樣吧,有你看過的題目也有你沒看到過的。
  • 成都學習Python開發哪家好
    如何選擇成都python培訓機構? python程式語言語法清晰、乾淨、易讀、易維護、代碼量小、可讀性強。當團隊合作開發時,閱讀別人的代碼將是非常迅速和高效的。通俗說來就是「寫起來快、看起來明白!」所以近年來,python開發非常流行。
  • 不懂NumPy 算什麼 Python 程式設計師?|CSDN 博文精選
    有了 NumPy,Python 程式設計師才有可能寫出媲美 C 語言運行速度的代碼。熟悉 NumPy,才能學會使用 PyOpenGL / PyOpenCV / Pandas / Matplotlib 等數據處理及可視化的模塊。
  • Python2 倒計時,還不快來掌握 Python3 酷炫的新特性?|原力計劃
    下面我們對比同一案例的新舊兩個版本Python的實現:from glob import globfile_contents = []for filename in glob('**/*.py', recursive=True):with open(filename) as python_file: file_contents.append(python_file.read