Сообщения

Сообщения за август, 2017

Мемоизация и каррирование

Мемоизация (memoization) - это способ оптимизации при котором сохраняется результат выполнения функции и этот результат используется при следующем вызове. Берем рекурсивную реализацию нахождения числа Фибоначчи и смотрим время выполнения @clock def fib (n): if n < 2 : return n return fib(n - 2 ) + fib(n - 1 ) print ( 'fib(20) =' , fib( 20 )) [0.35938287s] fib(20) -> 6765 Время работы будет очень быстро расти при увеличении числа которое нужно найти, плюс возможна ошибка RecursionError. Для оптимизации подобного алгоритма хорошо подходит метод мемоизации, то есть сохранение и повторное использования ранние вычисленных значений. _fib_cache = { 1 : 1 , 2 : 1 } @clock def mem_fib (n): result = _fib_cache . get(n) if result is None : result = mem_fib(n - 2 ) + mem_fib(n - 1 ) _fib_cache[n] = result return result print ( 'mem_fib(200) =' , mem_fib( 200 )) [0.03125453s] mem_fib(200) -&g

Декораторы функций в Python

Для понимания декораторов нужно помнить что, функция в Python это объект и функция может быть определена в другой функции. Так же нужно понимания  Области видимости и замыкания в Python . Декоратор функций в общем виде это функция которая принимает функцию и возвращает функцию. Так же возможна реализация через класс и реализацию метода __call__ Главное свойство декораторов -то, что они выполняются сразу после определения декорируемой функции. registry = [] def register (func): print ( 'running register(%s)' % func) registry . append(func) return func @register def f1 (): print ( 'running f1()' ) def f2 (): print ( 'running f2()' ) f2 = register(f2) # эквивалентно @register def f3 (): print ( 'running f3()' ) def main (): print ( 'running main()' ) print ( 'registry -> ' , registry) f1() f2() f3() if __name__ == '__main__' : main() Функция regi