from datetime import datetime
def memoize(f):
memo = dict()
def memo_fun(x):
if x in memo:
return memo[x]
r = f(x)
memo[x] = r
return r
return memo_fun
def fibonacci(x):
return x if (x <= 1) else \
fibonacci(x - 1) + fibonacci(x - 2)
mem_fibonacci = memoize(fibonacci)
for i in range(1, 3):
start = datetime.now()
f33 = mem_fibonacci(33)
delta = datetime.now() - start
seconds = delta.seconds
print(f"{i}: f33 is {f33}")
print(f"{i}: seconds is {seconds}")
# prints:
# 1: f33 is 3524578
# 1: seconds is 1
# 2: f33 is 3524578
# 2: seconds is 0
start = datetime.now()
f34 = mem_fibonacci(34)
delta = datetime.now() - start
seconds = delta.seconds
print(f"f34 is {f34}")
print(f"seconds is {seconds}")
# f34 is 5702887
# seconds is 3
| This memoization method works well with non-recursive functions. Because it only remembers the result of the first function call. |