当前位置:网站首页>一行代碼可以做什麼?

一行代碼可以做什麼?

2022-06-21 21:15:00 InfoQ

hello,大家好,我是 Jackpop,碩士畢業於哈爾濱工業大學,曾在華為、阿裏等大廠工作,如果你對昇學、就業、技術提昇等有疑惑,不妨交個朋友:

我是Jackpop,我們交個朋友吧!

可以做的事情太多了!一行代碼足以把程序的執行速度提昇超過10000倍!



緩存是一項從底層到高層都廣泛應用的技術,無論是前端還是後端,有一定開發經驗的程序員對緩存應該都不陌生。緩存是指可以進行高速數據交換的存儲器,它先於內存與CPU交換數據,因此速率很快。

在Python開發過程中,有一些函數的結果可能會被反複調用,如果這個函數耗時較少還無傷大雅。

但是,如果一個函數耗時10分鐘,或者頻繁的發送rest請求,那麼耗時就會呈現非線性上昇。

那麼,對於很多開發人員抱怨的Python,是否能够通過緩存來提昇它的開發效率?

答案是肯定的!

本文就來介紹如果利用緩存這項技術,實現1行代碼提昇Python執行速度。

LRU

不同的編程語言,會有不同 的緩存策略,例如,通過哈希映射、優先級隊列等實現緩存。因此,不同的編程語言,在緩存的解决方案方面具有很大差异,可能需要幾分鐘,也可能需要幾小時。

但是,在Python中,標准工具包functools實現了一種名為LRU(Least Recently Used)的緩存策略,可以通過傳入參數,來設定緩存最近多少次的計算結果,如果傳入參數為None,那麼會進行無限緩存。

現在,為了讓大家更加容易理解,先來舉一個例子,

import time as tt

def func():
 num = 0
 for i in range(10):
 num += i

 return num


def main():
 return func() + func() + func() + func() + func() + func() + func()


t1 = tt.time()
main()
print("Time taken: {}".format(tt.time() - t1))
# 9.05990e-6

在這個示例中,反複的調用了func函數,總共耗時為0.009秒。

下面,通過functools工具包下LRU緩存再跑一下,

import time as tt
import functools

@functools.lru_cache(maxsize=5)
def func():
 num = 0
 for i in range(10):
 num += i

 return num


def main():
 return func() + func() + func() + func() + func() + func() + func()


t1 = tt.time()
main()
print("Time taken: {}".format(tt.time() - t1))
# 4.768371e-06

通過數據對比,發現運行時間减少了將近50%。

在調用lru_cache時,需要配置一個maxsize的參數,它代錶著緩存最近幾次的函數計算結果,如果參數為none則不進行緩存。

通過前面的對比,會發現利用緩存機制時間差別會很大,這是由於,重複調用函數,需要反複執行計算過程,而利用緩存,我們只需要進行快速讀寫,不再需要重複執行計算過程,這樣會節省大部分時間。

但是,由於前面計算過程較為簡單,只涉及簡單的加法運算,在耗時方面給人直觀的感受並不是很强烈。

那下面在以另外斐波那契數列的例子進行對比一下。

應該很多同學對斐波那契數列都不陌生,一個很典型的遞歸問題,在教材上也頻繁的出現。

由於它遞歸計算的過程中,還會用到之前計算的結果,因此會涉及較多的重複計算,下面先看一下正常計算的耗時情况。

import time as tt

def fib(n):
 if n <= 1:
 return n
 return fib(n-1) + fib(n-2)

t1 = tt.time()
fib(30)
print(&quot;Time taken: {}&quot;.format(tt.time() - t1))
# 0.2073

加一行@functools.lru_cache(maxsize=5) 之後,看看效果:

import time as tt
import functools

@functools.lru_cache(maxsize=5)
def fib(n):
 if n <= 1:
 return n
 return fib(n-1) + fib(n-2)

t1 = tt.time()
fib(30)
print(&quot;Time taken: {}&quot;.format(tt.time() - t1))
# 1.811981e-05

0.2073秒對比2.0981e-5秒之間差了4個量級,快了10000+倍!這樣給人的直觀感受應該就非常强烈了。

在涉及一些簡單運算的過程中,即便是重複計算也無傷大雅。但是,如果涉及大量數據計算或者網絡請求這類耗時的計算,利用緩存機制,只需要1行代碼就可以節省可觀的時間。既比重複計算節省時間,也要比多餘定義變量簡單。


幹貨

最近,為了方便大家,我花費了半個月的時間把這幾年來收集的各種技術幹貨整理到一起,其中內容包括但不限於Python、機器學習、深度學習、計算機視覺、推薦系統、Linux、工程化、Java,內容多達5T+,我把各個資源下載鏈接整理到一個文檔內,目錄如下:

null
所有幹貨送給大家,希望能够點贊支持一下!

https://pan.baidu.com/s/1eks7CUyjbWQ3A7O9cmYljA
 (提取碼:0000)
原网站

版权声明
本文为[InfoQ]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/172/202206211933448115.html