今天看到Python3中有lru_cache
的function cache,无聊就试着在Python2.7中实现了一个简单的版本:
#!env python
#coding=utf-8
#
# Author: liuxingen@nsfocus.com
#
# Created Time: 2017年05月28日 星期日 09时34分06秒
#
# FileName: test_decorator_cache.py
#
# Description:
#
# ChangeLog:
from functools import wraps
from collections import OrderedDict
def cache(maxsize = 10):
def cache_decorator(fn):
_cache = OrderedDict()
@wraps(fn)
def inner(*args, **kwargs):
if args in _cache:
print 'hit cache!'
return _cache.get(args)
r = fn(*args, **kwargs)
if len(_cache) >= maxsize:
_key = _cache.keys()[0]
del _cache[_key]
print 'queue is full, del _cache[%s]' % (_key)
return _cache.setdefault(args, r)
return inner
return cache_decorator
@cache(maxsize = 2)
def fn(i):
print 'get fn(%d).' % (i)
return i*i
print fn(11)
print fn(13)
print fn(11)
print fn(15)
print fn(11)
print fn(13)
输出如下:
get fn(11).
121
get fn(13).
169
hit cache!
121
get fn(15).
queue is full, del _cache[11]
225
get fn(11).
queue is full, del _cache[13]
121
get fn(13).
queue is full, del _cache[15]
169