class Cache(object): def __init__(self, origfunc): self.origfunc = origfunc self.memo = {} def __call__(self, *args): if args in self.memo: return self.memo[args] answer = self.origfunc(*args) self.memo[args] = answer return answer @Cache def fibo(n): if n == 0: return 0 if n == 1: return 1 return fibo(n-1) + fibo(n-2) for i in range(200): fibo.memo.clear() print(i, fibo(i))