Python進階 函式快取 (Function caching)

weixin_34321977發表於2018-06-13

函式快取允許我們將一個函式對於給定引數的返回值快取起來。
當一個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]


# 我們也可以輕鬆地對返回值清空快取,通過這樣:
fib.cache_clear()

那個maxsize引數是告訴lru_cache,最多快取最近多少個返回值。


Python 2系列版本

你可以建立任意種類的快取機制,有若干種方式來達到相同的效果,這完全取決於你的需要。
這裡是一個一般的快取:

from functools import wraps

def memorize(function):
    memo = {}
    @wraps(function)
    def wrapper(*args):
        if args in memo:
            return memo[args]
        else:
            rv = function(*args)
            memo[args] = rv
            return rv
    return wrapper

@memorize
def fibonacci(n):
    if n < 2: return n
    return fibonacci(n - 1) + fibonacci(n - 2)

fibonacci(25)

相關文章