PiterPy 2015 - Трансдюсеры и Python

34
@maxmaxmaxmax МАКСИМ КЛИМИШИН CTO GVMachines Inc. Трансдюсеры и Python

Transcript of PiterPy 2015 - Трансдюсеры и Python

@maxmaxmaxmaxМАКСИМ КЛИМИШИНCTO GVMachines Inc.

Трансдюсеры и Python

Обо мне‣ 11+ лет опыта веб разработки, 6 лет Python

‣ Работал в oDesk, Helios, 42cc.

‣ Со-организатор конференций PyCon Ukraine, KyivJS, LvivJS

‣ 3 года работаю техническим директором в GVMachines стартапе (online grocery delivery)

НОВАЯ КОНЦЕПЦИЯ ПО РАБОТЕ С ДАННЫМИ

Rich Hickey6 августа 2014

добавлено в Clojure

ПОШЛО ХОРОШО

Концепция так хорошо пошла, что сейчас есть реализации для 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 …] читать вообще адово

iterable

map(f1)

map(f2)

filter(f3)

reducer

sequence

Трансдюсер

21

3

Выносим за пределы обработки

‣ функцию-трансформер или предикат

‣ функцию-накопитель результата обработки

Простейший трансдюсер готов!

Признайтесь, каждый к этому приходил, в том или ином виде?

В питоне уже полно иснтрументов

‣ itertools

‣ functools

‣ collections

КОМПОЗИЦИЯ

1.Последовательное прохождение

2.Буферизация обработки

3.Произвольное прерывание

1.Буферизация/стриминг

2.Независимость от типа данных и хранилища

3.Композиция хранилищ

НАКОПЛЕНИЕ

ПРОТОКОЛ

Нужно определить протокол

‣ Значение по умолчанию в зависимости от типа накопителя

‣ Прерывание редукции (early termination)

‣ Очистка после работы (clean up state)

Используем классы!

transduce

fizz buzz

fizz buzz

В ЦЕЛОМ

ПОЧЕМУ ВАЖНО?

чистые функции pure functions

нет побочных эффектов no side-effects

РАЗДЕЛЕНИЕ ОТВЕТСТВЕННОСТИ FTW!

MAP, FILTER, REDUCE – ЭТО ПРОСТО КРУТО

А ТРАНСДЮСЕРЫ – ЭТО ОФИГЕННО.

Спасибо!

@maxmaxmaxmax

Ссылочки:‣ 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/