Параллелизм в Python

Каковы опции для достижения параллелизма в Python? Я хочу выполнить набор зависящих от ЦП вычислений по некоторым очень большим растрам и хотел бы параллелизировать их. Происходя из среды C, я знаком с тремя подходами к параллелизму:

  1. Процессы передачи сообщений, возможно распределенные через кластер, например, MPI.
  2. Явный параллелизм общей памяти, или использующий pthreads или ветвление (), канал (), и. al
  3. Неявный параллелизм общей памяти, с помощью OpenMP.

Выбор подхода к использованию является упражнением в компромиссах.

В Python, какие подходы доступны и каковы их характеристики? Существует ли clusterable клон MPI? Каковы предпочтительные способы достигнуть параллелизма общей памяти? Я услышал ссылку на проблемы с GIL, а также ссылки на tasklets.

Короче говоря, что я должен знать о различных стратегиях распараллеливания в Python прежде, чем выбрать между ними?

22
задан fmark 7 June 2010 в 08:22
поделиться

4 ответа

Обычно вы описываете расчет ограничения ЦП. Это не сильная сторона Python. Ни то, ни другое исторически не является многопроцессорным.

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

Вы можете написать свой критический для производительности код на C или Cython и использовать Python в качестве клея.

12
ответ дан 29 November 2019 в 05:41
поделиться

В зависимости от того, сколько данных вам нужно обработать и сколько процессоров / машин вы собираетесь использовать, в некоторых случаях лучше написать их часть на C (или Java / C #, если вы хотите использовать jython / IronPython. )

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

0
ответ дан 29 November 2019 в 05:41
поделиться

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

5
ответ дан 29 November 2019 в 05:41
поделиться

Для этого существует множество пакетов, наиболее подходящим из которых, как уже говорилось, является многопроцессорность, особенно с классом "Pool".

Аналогичный результат может быть получен параллельным питоном , который дополнительно предназначен для работы с кластерами.

В любом случае, я бы сказал, используйте многопроцессорность.

0
ответ дан 29 November 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: