piterpy 2015 - Трансдюсеры и python
TRANSCRIPT
Обо мне‣ 11+ лет опыта веб разработки, 6 лет Python
‣ Работал в oDesk, Helios, 42cc.
‣ Со-организатор конференций PyCon Ukraine, KyivJS, LvivJS
‣ 3 года работаю техническим директором в GVMachines стартапе (online grocery delivery)
ПОШЛО ХОРОШО
Концепция так хорошо пошла, что сейчас есть реализации для JavaScript. Ruby , Erlang, C++ и так далее
I think this library was originally designed to fix a javascript problem, not a Python problem.
alcalde, reddit
Где пригодится‣ Обработка всевозможных выгрузок (больших текстовых данных, преобразования больших json-файлов, json-streaming)
‣ Анализ текста
‣ Любой код с серьезным анализом или преобразованием последовательностей
‣ Параллельные вычисления
Мой взгляд
‣ Со временем компонентов в системе становится больше, времени на поддержку этих компонентов уходит больше
‣ Поэтому читабельность кода и простота его отладки я рассматриваю как инвестицию, возможность тратить меньше времени на поддержку (сейчас или в будущем)
‣ И больше времени тратить на новые фичи
REDUCE
reduce(reducer, iterable[, initial])
whatever, input -> whatever
reduce более фундаментальная функция, чем map или filter.
С помощью reduce их легко реализовать
Transform Reducerфункция, которая принимает редюсер, преобразует его и возвращает новый редюсер
(whatever, input -> whatever) -> (whatever, input -> whatever)
А почему это надо?‣ Вложеность map/filter трудно читать (особенно любителям императивного кода)
‣ Это не очень эффективно в Python 2. В python 2 после каждого выполнения map/filter создается промежуточные значения. В python 3 есть lazy evaluation
‣ Вложенные [i for i in range(x) if …] читать вообще адово
Выносим за пределы обработки
‣ функцию-трансформер или предикат
‣ функцию-накопитель результата обработки
Простейший трансдюсер готов!
КОМПОЗИЦИЯ
1.Последовательное прохождение
2.Буферизация обработки
3.Произвольное прерывание
1.Буферизация/стриминг
2.Независимость от типа данных и хранилища
3.Композиция хранилищ
НАКОПЛЕНИЕ
Нужно определить протокол
‣ Значение по умолчанию в зависимости от типа накопителя
‣ Прерывание редукции (early termination)
‣ Очистка после работы (clean up state)
Ссылочки:‣ http://blog.cognitect.com/blog/2014/8/6/
transducers-are-coming
‣ http://sixty-north.com/blog/series/understanding-transducers-through-python
‣ http://www.slideshare.net/alinadolgikh/austin-bingham-transducers-in-python
‣ https://mathieularose.com/function-composition-in-python/