4. Memoized Decorator¶
Decorate your own function or class method with @memoized decorator to speed up it by storing the results and returning the cached result when the same inputs occur again
Example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | from decoratorutilities import memoized
import datetime
def util_run_function_with_time(fn, args, kwargs):
start_time = datetime.datetime.now()
tmp = fn(*args, **kwargs)
end_time = datetime.datetime.now()
return (end_time - start_time), tmp
@memoized
def memoized_fibonacci(x):
if x == 0:
return 0
if x == 1:
return 1
return memoized_fibonacci(x - 1) + memoized_fibonacci(x - 2)
def fibonacci(x):
if x == 0:
return 0
if x == 1:
return 1
return fibonacci(x - 1) + fibonacci(x - 2)
fib_value = 20
memoized_execution_time, memoized_value = util_run_function_with_time(memoized_fibonacci, (fib_value, ), {}) # Return execution time and value for memoized function
unmemoized_execution_time, unmemoized_value = util_run_function_with_time(fibonacci, (fib_value, ), {}) # Return execution time and value for unmemoized function
print(f"memoized_execution_time: {memoized_execution_time} - unmemoized_execution_time: {unmemoized_execution_time}")
assert memoized_execution_time < unmemoized_execution_time # True
assert memoized_value == unmemoized_value # True
|