Lambda expressions

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 <= 1else \
        fibonacci(x - 1) + fibonacci(x - 2)


mem_fibonacci = memoize(fibonacci)
for i in range(13):
    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.