# 【函数记忆】方法结果缓存装饰器 cache = {} def is_obsolete(entry, duration): d = time.time() - entry['time'] return d > duration def compute_key(function, args, kwargs): key = pickle.dumps((function.__name__, args, kwargs)) return hashlib.sha1(key).hexdigest() def memoize(duration=10): def _memorize(function): @wraps(function) # update_wrapper维持被修饰函数属性不变 def __memorize(*args, **kwargs): key = compute_key(function, args, kwargs) # 方法名和传入的参数不同key会不同 if key in cache: if not is_obsolete(cache[key], duration): print('%s 使用缓存' % function.__name__) return cache[key]['value'] else: print('%s 删除缓存' % function.__name__) del cache[key] # 删除过时缓存 result = function(*args, **kwargs) cache[key] = {'value': result, 'time': time.time()} return result return __memorize return _memorize
使用方法:
@memoize(10) def get_data_list(num, limit, skip): # data将会被缓存10秒,十秒内调用get_data_list方法将会使用缓存,10秒后将重新执行方法并再缓存10秒,以此类推... data = num + limit + skip return data