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)