Мемоизация и къри (Python)

Мемоизация

Това е метод за оптимизация, при който резултатът от изпълнението на функцията се съхранява и този резултат се използва при следващото извикване.

Взимаме рекурсивна реализация на намиране на числото на Фибоначи и разглеждаме времето за изпълнение.

python

Времето за изпълнение ще расте много бързо, тъй като броят за намиране се увеличава, плюс е възможна грешка на RecursionError.

За да оптимизирате такъв алгоритъм, методът на мемоизация е много подходящ, тоест запазване и повторно използване на по-рано изчислени стойности (но от самото начало, разбира се, трябва да се опитате напълно да изоставите рекурсивния алгоритъм).

Или като декоратор:

И добрата новина е, че стандартната библиотека на functools вече има хубава реализация на декоратора lru_cache.

LRU означава Най-малко използвани наскоро.

lru_cache има два незадължителни аргумента. maxsize е броят на съхранените резултати. типизирано - ако е вярно, например, стойностите 1 и 1.0 ще се считат за различни.

Мемоизацията е доста проста и ефективна практика. Functools.lru_cache го прави лесен за използване в Python. Под капака тя има речник под формата на хеш таблица, така че ключът трябва да реализира хеширане.

Сега за къри или къри (къри)

Карирането е трансформация на функция от много аргументи в набор от функции, всяка от които е функция на един аргумент. Можем да предадем част от аргументите на функция и да върнем функция, която очаква останалите аргументи.

Нека създадем проста функция greet, която приема поздрав и име като аргументи:

Малко подобрение ще ни позволи да създадем нова функция за всеки тип поздрав и да предадем име на тази нова функция:

И тогава можетенаправете го с произволен брой аргументи:

Или ламбда версията:

Частично приложение

Това е процес на прилагане на функция към част от нейните аргументи. С други думи, функция, която приема функция с множество параметри и връща функция с по-малко параметри.

Частичното приложение трансформира функция от n аргумента в (x-n), докато карирането създава n функции с 1 аргумент.

Python има такава възможност в стандартната библиотека functools, това е частичната функция.

Друг пример с частично разрешаване на проблема с цикъла:

Това е всичко за днес. Благодаря ти!

Hardcore conf в C++. Каним само професионалисти.