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

創(chuàng)新互聯(lián)建站專注于網(wǎng)站建設(shè),為客戶提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計開發(fā)服務(wù),多年建網(wǎng)站服務(wù)經(jīng)驗,各類網(wǎng)站都可以開發(fā),品牌網(wǎng)站制作,公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設(shè)計,建網(wǎng)站費用,建網(wǎng)站多少錢,價格優(yōu)惠,收費合理。
不久前,我構(gòu)建了一個日常運行的ETL管道,其通過從外部服務(wù)中抽取數(shù)據(jù)來豐富輸入數(shù)據(jù),然后將結(jié)果加載到數(shù)據(jù)庫中。
隨著輸入數(shù)據(jù)的增加,等待外部服務(wù)器的響應(yīng)變得非常費時,這使得ETL進程越來越慢。經(jīng)過一番調(diào)查,我發(fā)現(xiàn)與總記錄數(shù)(~500k)相比,并沒有太多不同的輸入值(~500)。
因此,換句話說,使用相同的參數(shù)調(diào)用外部服務(wù)時,每個參數(shù)大約要重復(fù)執(zhí)行1000次。
像這樣的情況是使用緩存的主要用例。緩存一個函數(shù)意味著無論何時首次計算函數(shù)的返回值,都會將其輸入和結(jié)果放在字典中。
對于每個后續(xù)函數(shù)調(diào)用,首先通過查看緩存來檢查結(jié)果是否已經(jīng)計算過。如果在緩存中找到了,那就很完美,不需要再次計算!如果沒有找到,就計算結(jié)果并將輸入和結(jié)果存儲在緩存中,以便下一個函數(shù)調(diào)用時查找到它。
Python標準庫附帶了許多鮮為人知但功能強大的軟件包。對于本示例,將使用functools中的lru_cache。(LRU代表“最近最少使用(Least Recently Used)”,正如字面意思,這明確意味著緩存將保留最近的輸入/結(jié)果對。)
從Fun(c)tools中導(dǎo)入lru_cache
把c放進括號中有點像一個蹩腳的笑話,因為這樣functools就變成了fun tools(有趣的工具),使用緩存當然很有趣!
這里無需過多解釋。導(dǎo)入lru_cache并用它來裝飾一個函數(shù),該函數(shù)將生成斐波那契數(shù)。
裝飾函數(shù)意味著將該函數(shù)與緩存函數(shù)包裝在一起,隨后每當調(diào)用fib_cache函數(shù)時,都將調(diào)用緩存的函數(shù)。
比賽開始
我們進行了一個實驗,計算函數(shù)的緩存和未緩存版本從0到40計算所有斐波那契數(shù)所花費的時間,并將結(jié)果放入各自的列表中。
獲勝者
對于較小的斐波那契數(shù),二者并沒有什么大的區(qū)別,但是一旦達到約30個樣本,緩存函數(shù)的效率增益就開始累加。
我沒有耐心讓未緩存的版本運行超過40個樣本,因為它的運行時間是指數(shù)增長的。而對于緩存的版本,它的運行時間只是線性增量。
這就完成了!距離Python緩存僅一行代碼之遙。畢竟它并沒那么可怕。
在初始示例中,我在Pandas數(shù)據(jù)框上使用了數(shù)據(jù)轉(zhuǎn)換。值得一提的是,緩存的函數(shù)可以傳遞給Pandas apply,而無需進行其它的任何更改。
是不是很棒?你也來試試吧~
網(wǎng)頁題目:加速函數(shù),每個Python程序員都應(yīng)該了解標準庫的Lru_cache
文章路徑:http://m.5511xx.com/article/dhdcpep.html


咨詢
建站咨詢
