memoization 是指通过缓存函数返回结果来加速函数调用的一种技术。仅当函数是纯函数 时结果才可以被缓存,也就是说,函数不能有任何副作用或输出,也不能依赖任何全局状态
import math _SIN_MEMOIZED_VALUES = {}
def memoized_sin(x):
if x not in _SIN_MEMOIZED_VALUES:
_SIN_MEMOIZED_VALUES[x] = math.sin(x)
return _SIN_MEMOIZED_VALUES[x] memoized_sin(1)
memoized_sin(2)
memoized_sin(2)
_SIN_MEMOIZED_VALUES
# {1: 0.8414709848078965, 2: 0.9092974268256817}
LRU
functools 模块提供了一个LRU(Least-Recently-Used)缓存装饰器。限定了缓存的条目数,当缓存的条目数达到最大时会移除最近最少使用的条目
import functools
import math @functools.lru_cache(maxsize=2)
def memoized_sin(x):
return math.sin(x) memoized_sin(2)
memoized_sin.cache_info()
memoized_sin(2)
memoized_sin.cache_info()
memoized_sin(3)
memoized_sin.cache_info()
memoized_sin(4)
memoized_sin.cache_info()
memoized_sin.cache_clear()
memoized_sin.cache_info()
# CacheInfo(hits=0, misses=0, maxsize=2, currsize=0)