函式快取允許我們將乙個函式對於給定引數的返回值快取起來。
當乙個i/o密集的函式被頻繁使用相同的引數呼叫的時候,函式快取可以節約時間。
在python 3.2版本以前我們只有寫乙個自定義的實現。在python 3.2以後版本,有個lru_cache
的裝飾器,允許我們將乙個函式的返回值快速地快取或取消快取。
我們來看看,python 3.2前後的版本分別如何使用它。
我們來實現乙個斐波那契計算器,並使用lru_cache
。
from functools import lru_cache
@lru_cache(maxsize=32)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
>>> print([fib(n) for n in range(10)])
# output: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
那個maxsize
引數是告訴lru_cache
,最多快取最近多少個返回值。
我們也可以輕鬆地對返回值清空快取,通過這樣:
fib.cache_clear()
你可以建立任意種類的快取機制,有若干種方式來達到相同的效果,這完全取決於你的需要。
這裡是乙個一般的快取:
from functools import wraps
def memoize(function):
memo = {}
@wraps(function)
if args in memo:
return memo[args]
else:
rv = function(*args)
memo[args] = rv
return rv
@memoize
def fibonacci(n):
if n < 2: return n
return fibonacci(n - 1) + fibonacci(n - 2)
fibonacci(25)
python實現快取 Python實現快取
注意 本文是乙個存根。稍會將發布有關不同的簡單快取實現的更詳細分析。請參閱下面的註解獲得大致的摘要。簡單快取實現 用法 注意,該實現使用普通列表來跟蹤訪問順序,以便能夠在快取填滿時丟棄最近最少使用的專案。列表型別沒有真正為此目的而優化,但是這種方法對於較小的快取非常有效,特別是當快取訪問遵循80 2...
python實現快取 Python實現快取
注意 本文是乙個存根。稍會將發布有關不同的簡單快取實現的更詳細分析。請參閱下面的註解獲得大致的摘要。簡單快取實現 用法 注意,該實現使用普通列表來跟蹤訪問順序,以便能夠在快取填滿時丟棄最近最少使用的專案。列表型別沒有真正為此目的而優化,但是這種方法對於較小的快取非常有效,特別是當快取訪問遵循80 2...
純函式,快取函式
不純的函式具有 下面以之前的計稅函式以例進行說明 var percentvalue 5 var calculatetax value 複製 這個函式不是純函式,主要因為它以來外部環境計算其邏輯,當外部環境改變時,它會影響結果。因此,純函式的主要特徵就是不依賴於任何外部變數,也不應該改變任何外部變數。...