6 библиотек Python для параллельной обработки

Python давно отличается удобством и удобством для программистов, но это не самый быстрый язык программирования. Некоторые из его ограничений скорости связаны с тем, что его реализация по умолчанию, cPython, является однопоточной. То есть cPython не использует одновременно более одного аппаратного потока.

И хотя вы можете использовать threadingвстроенный в Python модуль для ускорения работы, он threadingдает вам только параллелизм , а не параллелизм . Это хорошо для выполнения нескольких задач, не зависящих от ЦП, но ничего не делает для ускорения нескольких задач, для каждой из которых требуется полный ЦП. 

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

Иногда работа требует распределения работы не только между несколькими ядрами , но и несколькими машинами . Вот тут-то и пригодятся эти шесть библиотек и фреймворков Python. Все шесть наборов инструментов Python, представленных ниже, позволяют вам взять существующее приложение Python и распределить работу между несколькими ядрами, несколькими машинами или обоими.

Луч

Разработанный группой исследователей из Калифорнийского университета в Беркли, Ray лежит в основе ряда распределенных библиотек машинного обучения. Но Ray не ограничивается только задачами машинного обучения, даже если это был его первоначальный вариант использования. Любые задачи Python можно разбить и распределить по системам с помощью Ray.

Синтаксис Ray минимален, поэтому вам не нужно сильно переделывать существующие приложения для их распараллеливания. @ray.remoteДекоратор распространяет эту функцию через любые доступные узлы в кластере Ray, с необязательно заданными параметрами для скольких процессоров или графических процессоров для использования. Результаты каждой распределенной функции возвращаются в виде объектов Python, поэтому ими легко управлять и хранить, а объем копирования между узлами или внутри узлов сведен к минимуму. Эта последняя функция пригодится, например, при работе с массивами NumPy.

Ray даже включает в себя собственный встроенный диспетчер кластеров, который может автоматически наращивать узлы по мере необходимости на локальном оборудовании или популярных платформах облачных вычислений.

Видео по теме: Использование multiprocessingдля ускорения Python

Даск

Со стороны Даск очень похож на Рэя. Это также библиотека для распределенных параллельных вычислений на Python с собственной системой планирования задач, осведомленностью о фреймворках данных Python, таких как NumPy, и возможностью масштабирования от одной машины до многих.

Даск работает двумя основными способами. Первый - посредством распараллеливания структур данных - по сути, собственных версий Dask массивов NumPy, списков или Pandas DataFrames. Замените версии этих конструкций Dask на их значения по умолчанию, и Dask автоматически распространит их выполнение по вашему кластеру. Обычно для этого требуется немного больше, чем просто изменение имени импорта, но иногда может потребоваться переписывание для полной работы.

Второй способ заключается в использовании низкоуровневых механизмов распараллеливания Dask, включая декораторы функций, которые распределяют задания по узлам и возвращают результаты синхронно («немедленный» режим) или асинхронно («ленивый»). При необходимости оба режима можно смешивать.

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

Даск также предлагает продвинутую и все еще экспериментальную функцию под названием «актеры». Актер - это объект, который указывает на задание на другом узле Dask. Таким образом, задание, которое требует большого количества локального состояния, может выполняться на месте и вызываться удаленно другими узлами, поэтому состояние задания не нужно реплицировать. Рэю не хватает чего-то вроде актерской модели Даска, чтобы поддерживать более сложное распределение должностей.

Dispy

Dispy позволяет распределять целые программы Python или только отдельные функции по кластеру машин для параллельного выполнения. Он использует встроенные в платформу механизмы для сетевого взаимодействия, чтобы все работало быстро и эффективно, поэтому машины с Linux, MacOS и Windows работают одинаково хорошо.

Синтаксис Dispy чем-то напоминает multiprocessing то, что вы явно создаете кластер (в котором multiprocessingвы должны создать пул процессов), отправляете работу в кластер, а затем получаете результаты. Для изменения заданий для работы с Dispy может потребоваться немного больше работы, но вы также получите точный контроль над тем, как эти задания отправляются и возвращаются. Например, вы можете возвращать предварительные или частично завершенные результаты, передавать файлы как часть процесса распределения заданий и использовать шифрование SSL при передаче данных.

Пандарал·лель

Pandaral·lel, как следует из названия, - это способ распараллеливать задания Pandas на нескольких узлах. Обратной стороной является то, что Pandaral·lel работает только  с пандами. Но если Pandas - это то, что вы используете, и все, что вам нужно, это способ ускорить работу Pandas на нескольких ядрах на одном компьютере, Pandaral·lel сфокусирован на этой задаче.

Обратите внимание, что хотя Pandaral·lel действительно работает в Windows, он будет запускаться только из сеансов Python, запущенных в подсистеме Windows для Linux. Пользователи MacOS и Linux могут запускать Pandaral·lel как есть. 

Ipyparallel

Ipyparallel - это еще одна узконаправленная многопроцессорная система и система распределения задач, специально предназначенная для распараллеливания выполнения кода записной книжки Jupyter в кластере. Проекты и команды, уже работающие в Jupyter, могут сразу начать использовать Ipyparallel.

Ipyparallel поддерживает множество подходов к распараллеливанию кода. На простом конце есть map, который применяет любую функцию к последовательности и равномерно распределяет работу по доступным узлам. Для более сложной работы вы можете украсить определенные функции, чтобы они всегда выполнялись удаленно или параллельно.

Блокноты Jupyter поддерживают «волшебные команды» для действий, возможных только в среде записной книжки. Ipyparallel добавляет несколько собственных волшебных команд. Например, вы можете добавить к любому оператору Python префикс, %pxчтобы автоматически распараллелить его.

Joblib

Joblib преследует две основные цели: выполнять задания параллельно и не пересчитывать результаты, если ничего не изменилось. Благодаря этой эффективности Joblib хорошо подходит для научных вычислений, где воспроизводимые результаты неприкосновенны. Документация Joblib предоставляет множество примеров того, как использовать все его функции.

Синтаксис Joblib для распараллеливания работы достаточно прост - он представляет собой декоратор, который можно использовать для разделения заданий между процессорами или для кэширования результатов. Параллельные задания могут использовать потоки или процессы.

Joblib включает прозрачный дисковый кеш для объектов Python, созданных вычислительными заданиями. Этот кеш не только помогает Joblib избежать повторения работы, как отмечалось выше, но также может использоваться для приостановки и возобновления длительно выполняемых заданий или возобновления работы с того места, где задание было остановлено после сбоя. Кэш также оптимизирован для больших объектов, таких как массивы NumPy. Области данных могут совместно использоваться в памяти между процессами в одной системе с помощью numpy.memmap.

Одна вещь, которую Joblib не предлагает, - это способ распределения заданий между несколькими отдельными компьютерами. Теоретически для этого можно использовать конвейер Joblib, но, вероятно, проще использовать другой фреймворк, который поддерживает его изначально. 

Узнать больше о Python

  • Что такое Python? Мощное, интуитивно понятное программирование
  • Что такое PyPy? Более быстрый Python без боли
  • Что такое Cython? Python на скорости C
  • Учебник Cython: как ускорить Python
  • Как правильно установить Python
  • Лучшие новые функции Python 3.8
  • Лучшее управление проектами Python с помощью Poetry
  • Virtualenv и venv: объяснение виртуальных сред Python
  • Что можно и чего нельзя делать в Python virtualenv и venv
  • Объяснение потоковой передачи и подпроцессов Python
  • Как использовать отладчик Python
  • Как использовать timeit для профилирования кода Python
  • Как использовать cProfile для профилирования кода Python
  • Начните работу с асинхронным программированием в Python
  • Как использовать asyncio в Python
  • Как преобразовать Python в JavaScript (и обратно)
  • Python 2 EOL: как пережить конец Python 2
  • 12 питонов на любой вкус
  • 24 библиотеки Python для каждого разработчика Python
  • 7 замечательных Python IDE, которые вы могли пропустить
  • 3 основных недостатка Python и их решения
  • Сравнение 13 веб-фреймворков Python
  • 4 тестовых фреймворка Python для устранения ваших ошибок
  • 6 отличных новых функций Python, которые нельзя пропустить
  • 5 дистрибутивов Python для освоения машинного обучения
  • 8 отличных библиотек Python для обработки естественного языка