加速函數,每個Python程式設計師都應該了解標準庫的Lru_cache

2020-12-22 讀芯術

全文共1291字,預計學習時長4分鐘

來源:Pexels

加速新境界:通過使用簡單的緩存功能,僅需一行代碼即可加速你的函數。

不久前,我構建了一個日常運行的ETL管道,其通過從外部服務中抽取數據來豐富輸入數據,然後將結果加載到資料庫中。

隨著輸入數據的增加,等待外部伺服器的響應變得非常費時,這使得ETL進程越來越慢。經過一番調查,我發現與總記錄數(~500k)相比,並沒有太多不同的輸入值(~500)。

因此,換句話說,使用相同的參數調用外部服務時,每個參數大約要重複執行1000次。

像這樣的情況是使用緩存的主要用例。緩存一個函數意味著無論何時首次計算函數的返回值,都會將其輸入和結果放在字典中。

對於每個後續函數調用,首先通過查看緩存來檢查結果是否已經計算過。如果在緩存中找到了,那就很完美,不需要再次計算!如果沒有找到,就計算結果並將輸入和結果存儲在緩存中,以便下一個函數調用時查找到它。

Python標準庫附帶了許多鮮為人知但功能強大的軟體包。對於本示例,將使用functools中的lru_cache。(LRU代表「最近最少使用(Least Recently Used)」,正如字面意思,這明確意味著緩存將保留最近的輸入/結果對。)

從Fun(c)tools中導入lru_cache

把c放進括號中有點像一個蹩腳的笑話,因為這樣functools就變成了fun tools(有趣的工具),使用緩存當然很有趣!

這裡無需過多解釋。導入lru_cache並用它來裝飾一個函數,該函數將生成斐波那契數。

裝飾函數意味著將該函數與緩存函數包裝在一起,隨後每當調用fib_cache函數時,都將調用緩存的函數。

比賽開始

我們進行了一個實驗,計算函數的緩存和未緩存版本從0到40計算所有斐波那契數所花費的時間,並將結果放入各自的列表中。

獲勝者

對於較小的斐波那契數,二者並沒有什麼大的區別,但是一旦達到約30個樣本,緩存函數的效率增益就開始累加。

我沒有耐心讓未緩存的版本運行超過40個樣本,因為它的運行時間是指數增長的。而對於緩存的版本,它的運行時間只是線性增量。

這就完成了!距離Python緩存僅一行代碼之遙。畢竟它並沒那麼可怕。

在初始示例中,我在Pandas數據框上使用了數據轉換。值得一提的是,緩存的函數可以傳遞給Pandas apply,而無需進行其它的任何更改。

來源:Pexels

是不是很棒?你也來試試吧~

留言點讚關注

我們一起分享AI學習與發展的乾貨

如轉載,請後臺留言,遵守轉載規範

相關焦點

  • 新手請進:每個Python程式設計師都應該知道的10個縮寫詞
    學習過程中,我們會逐漸熟悉它的數據結構、控制流、類、函數和其他基本知識。還有一件有趣的事人們不常提起:我們時不時就會遇到Python中的各種首字母縮寫詞。本文將回顧十個這樣的縮寫詞,包括通用的編程原理以及特定的Python編碼,每個詞都有自己有用有趣的方面。1.
  • Python 中最流行的十個標準庫
    但最重要的一點是,我們只想收集 Python 標準庫,而不是所有在倉庫中使用的包,比如本地定義的庫,它們只有在倉庫中才有意義。Python 標準庫是和 Python 語言一起發布的。因此,為了將標準包和其他包分開,我們需要拉取 Python 中所有有效的標準庫。然後,我們可以寫一個函數來收集原始碼中的庫名。
  • 標準庫函數與基於HAL庫函數
    一、標準庫STM32有非常多的寄存器,導致了開發困難,所以為此ST公司就為每款晶片都編寫了一份庫文件,也就是工程文件裡stm32F1xx……之類的。在這些 .c .h文件中,包括一些常用量的宏定義,把一些外設也通過結構體變量封裝起來,如GPIO口時鐘等。所以我們只需要配置結構體變量成員就可以修改外設的配置寄存器,從而選擇不同的功能。
  • Python 優秀函數庫組成的最佳陣容
    Python的強大在於擁有超級強大的庫函數支持,我們把Python 常見的庫列舉了一下,排了個整型,用足球的4231 來表達。對程式設計師來講,當代的 「文房四寶」 不外乎是:筆記本,大屏幕,機械鍵盤,人體工學椅,Google,Github 這幾種。下文簡單介紹一下 python 的幾個最為重要的數據分析模塊。Numpy 是 Python 提供數值計算的基礎模塊,也是 Python 生態中歷史最為悠久的模塊。
  • python教程13課:python函數的詳細講解(一)
    python函數為什麼我們要定義函數?是為了將代碼模塊化提高代碼的重複使用率定義函數:函數代碼塊使用 def關鍵字開頭定義,後面跟上函數名稱和 ( ),後面再接上冒號任何傳入的參數都應該放到 括號裡面第二行開始函數裡面的內容使用縮進如果函數有返回值,咱們使用 return,如果沒有寫return,默認表示返回 None函數名必須以下劃線或者字母開頭,可以包含數字、字母、下劃線等組合
  • 這些Python代碼技巧,你肯定還不知道
    想要了解更多,點這裡:https://docs.python.org/3/library/functions.html#diremoji是的,真的有。geopy地理(Geography)對於程式設計師來說可能是一個具有挑戰性的領域。但是 geopy 模塊讓它變得異常簡單。
  • 程式設計師應如何理解include
    讓我們簡單的了解一下可執行程序的生成過程。程式設計師寫的大家都可讀的代碼是不能被CPU直接執行的,CPU可以執行的代碼是二進位機器指令,因此一定有某個過程將程式設計師寫的程序轉換為了機器指令,這就是編譯器。以上大部分同學應該都知道,但是你知道編譯器在將代碼翻譯成機器指令前其實還有一個步驟嗎?這個步驟就是預編譯。那麼預編譯都用來做什麼呢?
  • Redis中的LRU淘汰策略分析
    當訪問模式很少改變時,可以記錄每個數據的最後一次訪問時間,擁有最少空閒時間的數據可以被認為將來最有可能被訪問到。淘汰策略即maxmemory_policy的賦值有以下幾種:noeviction:如果緩存數據超過了maxmemory限定值,並且客戶端正在執行的命令(大部分的寫入指令,但DEL和幾個指令例外)會導致內存分配,則向客戶端返回錯誤響應allkeys-lru: 對所有的鍵都採取LRU
  • Python最重要的5大功能,要是能早點了解就好了!
    即使你是一名從其他語言(比如C語言或MATLAB語言)轉換過來的程式設計師,用更加抽象的Python編寫代碼對你來說也絕對是一次不同的體驗。但功能雖多,總有主次之分。為了方便大家早點了解Python的一些大功能,小芯特別整理出了其中5大最重要的功能。
  • Python 吞噬世界!程式設計師的副業如何成為全球最熱語言
    1994 年末,一組從全美國選出來的程式設計師聚在一起討論他們的新型秘密武器。這是針對新型程式語言 Python 舉辦的第一次 workshop,共有二十來個程式設計師參加,Barry Warsaw 是其中之一。他記得當時這些第一批用 Python 的人都很興奮。
  • 寫Python 代碼不可不知的函數式編程技術
    近來,越來越多人使用函數式編程(functional programming)。因此,很多傳統的命令式語言(如 Java 和 Python)開始支持函數式編程技術。本文對 Python 中的函數式編程技術進行了簡單的入門介紹。本文適合對函數式編程有基本了解的讀者。
  • Python字符串函數用法大全
    i love pythongross - αgroß - α注意 lower()函數和casefold()函數的區別:lower() 方法只對ASCII編碼,即『A-Z』有效,對於其它語言中把大寫轉換為小寫的情況無效,只能用 casefold() 函數。
  • 乾貨| 如何寫一個更好的Python函數?
    「好」的Python函數和「差」的Python函數之間有什麼差別呢?每個人都有自己的理解。基於我的理解,如果一個Python函數能夠符合下面的大部分條件,我會認為它是一個「好」函數:命名合理單一功能包括文檔字符串返回一個值不超過50行是冪等函數或純函數對許多人來說,這些要求可能顯得過於苛刻了。
  • Python - 超級好用的函數eval
    前言eval是Python的一個內置函數,這個函數的作用是,返回傳入字符串的表達式的結果。即變量賦值時,等號右邊的表示是寫成字符串的格式,返回值就是這個表達式的結果。命名空間python是用命名空間來記錄變量的軌跡的,命名空間是一個dictionary,鍵是變量名,值是變量值。在一個 Python 程序中的任何一個地方,都存在幾個可用的名字空間。每個函數都有著自已的名字空間,叫做局部名字空間,它記錄了函數的變量,包括函數的參數和局部定義的變 量。
  • python與c語言的語法有哪些不一樣的
    在眾多程式語言之中,想必很多人都聽說過Python和C語言,在進行編程學習之前,大家都會問:python和c語言的區別有哪些?我該如何選擇?接下來我們來看看吧。2、內存管理:Python使用自動垃圾收集器進行內存管理;在C語言中,程式設計師必須自己進行內存管理。3、應用:Python是一種通用程式語言,多範式的,支持面向對象編程、程序編程以及函數編程;C是結構化程式語言,允許使用函數、選擇、迭代,主要用於硬體相關的應用程式。
  • 給程式設計師的 30 個基本 Python 貼士與技巧
    >給程式設計師的 30 個基本 Python 貼士與技巧存儲列表元素到新的變量中我們可以使用列表來初始化多個變量,在解析列表時,變量的數目不應該超過列表中的元素個數:【譯者註:元素個數與列表長度應該嚴格相同,不然會報錯】testList = [1,2,3]x, y, z = testListprint(x, y, z)
  • 黑馬程式設計師:JavaScript函數介紹:5分鐘了解JavaScript
    什麼是函數?把一段相對獨立的具有特定功能的代碼塊封裝起來,形成一個獨立實體,就是函數,起個名字(函數名),在後續開發中可以反覆調用。函數的作用就是封裝一段代碼,將來可以重複使用。推薦了解黑馬程式設計師web前端課程。為什麼要使用函數?為了解決代碼的重用!
  • 慢步學習二級python,字符串類型的操作:操作符,函數和方法
    繼續學習二級python考試的大綱內容:4.字符串類型的操作:字符串操作符,處理函數和處理方法學習字符串類型數據的操作是學習python的基礎。字符串處理函數因為書本不在身邊,暫時能想起的字符串處理函數極其有限,不過不影響筆者寫文,咱重在學習理解,理解好了,可以舉一反三。len()函數筆者先建立一個字符串變量a,賦值。然後使用len()函數。
  • 世界上最慢「動物」之一,為什麼程式設計師卻很愛?
    在程式設計師的世界,也有一個最慢的「動物」—— Python。作為使用最廣泛的程式語言之一,Python已經走過了20多個年頭。不少剛接觸 Python 的初學者或者使用其他語言的程式設計師,經常會有疑問:「為什麼 Python 這麼慢,還能這麼受歡迎?」
  • 如何自學成 Python 大神?這裡有些建議
    這兩種方法都有各自存在的價值,兩者的結合將會讓你對程式語言了解得更全面。再次強調,關鍵點還是要在於對編程保持持續性,讓你的大腦保持住對語言語法的了解,並改善你解決問題的思維過程。想要解決一個問題,你需要非常清楚地了解問題本身。我的意思是你需要了解輸入、輸出、約束條件、規則和許多其他的東西。以下是我推薦的一些步驟: 了解 Python 的基礎知識掌握任何一門程式語言的基礎都是非常重要的。你至少首先應該明白如何輸入和輸出。