Can you help me with this memoization simple example?
marc nicole
mk1853387 at gmail.com
Sat Mar 30 20:09:43 EDT 2024
I am creating a memoization example with a function that adds up / averages
the elements of an array and compares it with the cached ones to retrieve
them in case they are already stored.
In addition, I want to store only if the result of the function differs
considerably (passes a threshold e.g. 500000 below).
I created an example using a decorator to do so, the results using the
decorator is slightly faster than without the memoization which is OK, but
is the logic of the decorator correct ? anybody can tell me ?
My code is attached below:
import time
def memoize(f):
cache = {}
def g(*args):
if args[1] == "avg":
sum_key_arr = sum(list(args[0])) / len(list(args[0]))
elif args[1] == "sum":
sum_key_arr = sum(list(args[0]))
if sum_key_arr not in cache:
for (
key,
value,
) in (
cache.items()
): # key in dict cannot be an array so I use the sum of the
array as the key
if (
abs(sum_key_arr - key) <= 500000
): # threshold is great here so that all values are
approximated!
# print('approximated')
return cache[key]
else:
# print('not approximated')
cache[sum_key_arr] = f(args[0], args[1])
return cache[sum_key_arr]
return g
@memoize
def aggregate(dict_list_arr, operation):
if operation == "avg":
return sum(list(dict_list_arr)) / len(list(dict_list_arr))
if operation == "sum":
return sum(list(dict_list_arr))
return None
t = time.time()
for i in range(200, 15000):
res = aggregate(list(range(i)), "avg")
elapsed = time.time() - t
print(res)
print(elapsed)
More information about the Python-list
mailing list