Запоминание, проще говоря, запоминание, если вы уже вызывали функцию с конкретными аргументами.Если он у вас есть, он просто возвращает уже рассчитанное возвращаемое значение, а не вычисляет его снова.
import time
def long_calculation(x, y, memo={}):
try:
result = memo[x, y] # already calculated!
except KeyError:
# make long_calculation take a long time!
time.sleep(2)
result = x * y
memo[x, y] = result
return result
Словарь memo
может запоминать вызовы функции, поскольку он вычисляется при первой загрузке функции:при каждом вызове long_calculation
используется один и тот же словарь memo
.
Чтобы проверить это, попробуйте:
# Note that (2,2) (7,8) and (10,10) are repeated here:
test_values = ((2,2),(4,5),(2,2),(7,8),(2,3),(7,8),(10,11),(4,5),(10,10),(10,10))
for values in test_values:
start = time.time()
res = long_calculation(*values)
end = time.time()
elapsed = end-start
print(values,' calculated in ',elapsed, "seconds")
Вставить такой код в ваш класс должно быть довольно легко.Если вам всегда нужны вычисленные атрибуты, вы можете поместить вызов в __init__
.