Решение
Вы можете исправить код, используя OrderedDict
, например:
from collections import OrderedDict
def memoize(f, k):
cache = OrderedDict()
def mem_f(*args):
if args in cache:
return cache[args]
result = f(*args)
if len(cache) >= k:
cache.popitem(last=False)
cache[args]= result
return result
return mem_f,cache
Тестирование
def mysum(a, b):
return a + b
mysum_cached,cache = memoize(mysum, 10)
for i in range(100)
mysum_cached(i, i)
print(cache)
Вывод:
OrderedDict([((90, 90), 180), ((91, 91), 182), ((92, 92), 184), ((93, 93), 186), ((94, 94), 188), ((95, 95), 190), ((96, 96), 192), ((97, 97), 194), ((98, 98), 196), ((99, 99), 198)])
Эта версия memoize
, вероятно, будет хорошо работать для вашего собственного кода.Однако для производственного кода (т. Е. Кода, на который должны полагаться другие люди), вам, вероятно, следует использовать стандартную библиотечную функцию (functools.lru_cache
), которую предлагает Марк Мейер.