def cache(func): 'Optimize a pure function by caching prior results' prior_results = {} @wraps(func) def newfunc(*args): if args in prior_results: return prior_results[args] result = func(*args) prior_results[args] = result return result return newfunc @cache def fibo(n): if n == 0: return 0 if n == 1: return 1 return fibo(n-1) + fibo(n-2)