Python函式快取

2022-06-11 18:18:10 字數 1173 閱讀 7005

函式快取允許我們將乙個函式對於給定引數的返回值快取起來。

當乙個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 複製 這個函式不是純函式,主要因為它以來外部環境計算其邏輯,當外部環境改變時,它會影響結果。因此,純函式的主要特徵就是不依賴於任何外部變數,也不應該改變任何外部變數。...