Итак, эта страница о мемоизации меня заинтересовала. Я провел собственные тесты.
1) Изменяемый словарь по умолчанию:
%%timeit
def fibo(n, dic={}) :
if n not in dic :
if n in (0,1) :
dic[n] = 1
else :
dic[n] = fibo(n-1)+fibo(n-2)
return dic[ n ]
fibo(30)
Из:
100000 loops, best of 3: 18.3 µs per loop
2) Та же идея, но по принципу «Легче попросить прощения, чем разрешения»:
In [21]:
%%timeit
def fibo(n, dic={}) :
try :
return dic[n]
except :
if n in (0,1) :
dic[n] = 1
else :
dic[n] = fibo(n-1)+fibo(n-2)
return dic[ n ]
fibo(30)
Из:
10000 loops, best of 3: 46.8 µs per loop
Мои вопросы
- Почему 2) такой медленный по сравнению с 1)?
Редактировать
Как предполагает @kevin в комментариях, я совершенно неправильно понял декоратор, поэтому удалил его. Остаток в силе! (Я надеюсь)
f
. Когда вы декорируетеfibo
, вы фактически отбрасываете определение этой функции и заменяете его функцией из примера 1. - person Kevin   schedule 25.08.2014TypeError
илиNameError
обычно просто сворачивают приложение и все :-) - person BartoszKP   schedule 25.08.2014hasattr
илиif key in d:
. Другая область, в которой этот принцип часто используется, — это проверка существования ключей/атрибутов перед попыткой их использования, что (иногда) с большей вероятностью будет прощено. - person dano   schedule 25.08.2014