Что такое Pipelines в Python?

Если вы являетесь разработчиком на Python, возможно, вы слышали термин «pipeline» (трубопровод/последовательность). Но что именно такое трубопровод, и почему он полезен? В этом посте я рассмотрю концепцию pipelines в Python, как они работают и как они могут помочь вам писать более чистый и эффективный код.

Что такое Pipeline?

Pipeline — это способ организации серии операций или функций для обработки данных. Результат одной операции становится входом для следующей, и так далее, пока не получается конечный результат. Канал можно представить как цепь труб, где данные перемещаются от одной трубы к другой, проходя при этом через преобразование или манипуляции.

Например, предположим, у вас есть список чисел, и вы хотите выполнить следующие операции:

  • Отфильтровать нечетные числа.
  • Умножить каждое число на 10.
  • Добавить 5 к каждому числу.
  • Вычислить среднее значение полученных чисел.

Один из способов сделать это — написать цикл, который итерируется по списку и применяет каждую операцию поочередно, сохраняя промежуточные результаты в новом списке. Например:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filtered = []
for n in numbers:
    if n % 2 == 0:
        filtered.append(n)
multiplied = []
for n in filtered:
    multiplied.append(n * 10)
added = []
for n in multiplied:
    added.append(n + 5)
total = 0
count = 0
for n in added:
    total += n
    count += 1
average = total / count
print(average)
Python

Этот код работает, но он не очень изящен или эффективен. Он создает три новых списка, которые занимают память и делают код менее читаемым. Также требуется написание четырех циклов, что может быть утомительным и подвержено ошибкам.

Более эффективным способом сделать это является использование последовательности. Они позволяют объединить операции вместе, без создания промежуточных списков или циклов. Можно использовать встроенные функции map и filter, которые принимают функцию и итерируемый объект в качестве аргументов и возвращают новый итерируемый объект, применяя функцию к каждому элементу исходного итерируемого объекта. Также можно использовать функции sum и len, которые вычисляют сумму и длину итерируемого объекта соответственно. Например:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
average = sum(map(lambda n: n + 5, map(lambda n: n * 10, filter(lambda n: n % 2 == 0, numbers)))) / len(numbers)
print(average)
Python

Этот код намного короче и проще, чем предыдущий. Он не создает новых списков или циклов, и легко видеть поток данных от одной операции к следующей. Тем не менее, он все еще не очень читаем, поскольку использует вложенные вызовы map и filter, что может быть запутанным и сложным для отслеживания.

Более читабельным способом написания канала является использование функции pipe из библиотеки toolz. Функция pipe принимает начальное значение и серию функций, применяет каждую функцию к выводу предыдущей, возвращая конечный результат. Например:

from toolz import pipe
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
average = pipe(numbers, 
               filter(lambda n: n % 2 == 0), 
               map(lambda n: n * 10), 
               map(lambda n: n + 5), 
               lambda x: sum(x) / len(x))
print(average)
Python

Этот код более читаем и элегантен по сравнению с предыдущими. Он четко показывает последовательность операций, применяемых к данным, и не использует вложенных вызовов или промежуточных списков. Функция pipe делает код похожим на канал, где данные переходят от одной функции к следующей.

Зачем использовать pipelines?

Pipelines имеют несколько преимуществ по сравнению с другими способами организации кода. Некоторые из них:

  1. Читаемость: Pipelines делают код более читаемым и понятным, так как они показывают поток данных от одной операции к следующей, без загромождения кода промежуточными переменными или циклами. Pipelines также делают код более модульным и повторно используемым, так как каждую операцию можно определить как отдельную функцию, которую легко тестировать и использовать в различных контекстах.
  2. Эффективность: Pipelines могут улучшить эффективность кода, поскольку они избегают создания промежуточных списков или итерируемых объектов, которые занимают память и замедляют выполнение. Pipelines также поддерживают отложенное выполнение, что означает, что операции выполняются только тогда, когда данные нужны, а не заранее. Это может сэкономить время и ресурсы, особенно при работе с большими или бесконечными источниками данных.
  3. Гибкость: Pipelines легко модифицируются или расширяются, поскольку они позволяют добавлять, удалять или изменять порядок операций без влияния на остальной код. Pipelines также поддерживают различные типы операций, такие как фильтрация, отображение, уменьшение, агрегация, группировка, сортировка и т.д., которые могут быть комбинированы различными способами для достижения различных результатов.

Как использовать pipelines в Python?

Существует несколько способов создания и использования pipelines в Python. Некоторые из них:

  1. Использование встроенных функций: Python предоставляет несколько встроенных функций, которые можно использовать для создания каналов, таких как map, filter, reduce, zip, enumerate, sorted, reversed и т.д. Эти функции принимают функцию и итерируемый объект в качестве аргументов и возвращают новый итерируемый объект, применяя функцию к каждому элементу исходного итерируемого объекта.
  2. Использование списочных включений: Списочные включения — это краткий и выразительный способ создания списков в Python, используя синтаксис, напоминающий математическую нотацию. Списочные включения также можно использовать для создания каналов, применяя серию операций к каждому элементу итерируемого объекта и собирая результаты в новом списке.
  3. Использование генераторных выражений: Генераторные выражения похожи на списочные включения, но они возвращают объект-генератор вместо списка. Объект-генератор является итерируемым и производит элементы по требованию, без их хранения в памяти. Генераторные выражения также можно использовать для создания каналов, применяя серию операций к каждому элементу итерируемого объекта и возвращая результаты в виде генератора.

Если у вас есть вопросы или отзывы, пожалуйста, оставьте комментарий ниже. Спасибо за чтение!


Опубликовано

в

от

Комментарии

Добавить комментарий