Вероятно, это тривиальный вопрос, но как мне распараллелить следующий цикл в python?
# setup output lists
output1 = list()
output2 = list()
output3 = list()
for j in range(0, 10):
# calc individual parameter value
parameter = j * offset
# call the calculation
out1, out2, out3 = calc_stuff(parameter = parameter)
# put results into correct output list
output1.append(out1)
output2.append(out2)
output3.append(out3)
Я знаю, как запускать отдельные потоки в Python, но я не знаю, как «собрать» результаты.
Многократные процессы были бы также хороши - что бы ни было проще для этого случая. В настоящее время я использую Linux, но код также должен работать на Windows и Mac.
Какой самый простой способ распараллелить этот код?
источник
calc_stuff
?multiprocessing
модуля для более полных примеров.Pool.map()
в принципе работает какmap()
, но параллельно.Чтобы распараллелить простой цикл for, joblib придает большое значение необработанному использованию многопроцессорной обработки. Не только короткий синтаксис, но и такие вещи, как прозрачное группирование итераций, когда они выполняются очень быстро (для устранения накладных расходов) или захват трассировки дочернего процесса, для лучшей отчетности об ошибках.
Отказ от ответственности: я оригинальный автор joblib.
источник
Мне это очень нравится
concurrent.futures
, доступно в Python3 начиная с версии 3.2 - и через backport до 2.6 и 2.7 на PyPi .Вы можете использовать потоки или процессы и использовать точно такой же интерфейс.
многопроцессорная обработка
Поместите это в файл - futuretest.py:
И вот вывод:
Многопоточность
Теперь перейдите
ProcessPoolExecutor
вThreadPoolExecutor
и снова запустите модуль:Теперь вы сделали как многопоточность, так и многопроцессорность!
Обратите внимание на производительность и использование обоих вместе.
Выборка слишком мала, чтобы сравнить результаты.
Однако я подозреваю, что многопоточность будет быстрее, чем многопроцессорность в целом, особенно в Windows, поскольку Windows не поддерживает разветвление, поэтому каждому новому процессу требуется время для запуска. На Linux или Mac они, вероятно, будут ближе.
Вы можете вкладывать несколько потоков в несколько процессов, но рекомендуется не использовать несколько потоков для выделения нескольких процессов.
источник
Вышеописанное прекрасно работает на моей машине (Ubuntu, пакет joblib был предварительно установлен, но может быть установлен через
pip install joblib
).Взято с https://blog.dominodatalab.com/simple-parallelization/
источник
Использование Ray имеет ряд преимуществ :
В вашем случае вы можете запустить Ray и определить удаленную функцию
а затем вызвать его параллельно
Чтобы запустить тот же пример в кластере, единственной строкой, которая могла бы измениться, был бы вызов ray.init (). Соответствующую документацию можно найти здесь .
Обратите внимание, что я помогаю развивать Рэя.
источник
Это самый простой способ сделать это!
Вы можете использовать Asyncio . (Документация может быть найдена здесь ). Он используется в качестве основы для нескольких асинхронных сред Python, которые предоставляют высокопроизводительные сетевые и веб-серверы, библиотеки подключений к базам данных, распределенные очереди задач и т. Д. Кроме того, он имеет как высокоуровневые, так и низкоуровневые API для решения любых задач. ,
Теперь эта функция будет запускаться параллельно при каждом вызове без перевода основной программы в состояние ожидания. Вы также можете использовать его для распараллеливания цикла. Когда вызывается для цикла for, хотя цикл является последовательным, но каждая итерация выполняется параллельно основной программе, как только туда попадает интерпретатор. Например:
Это дает следующий результат:
источник
wrapped()
и это должно быть**kwargs
вместо*kwargs
почему вы не используете потоки и один мьютекс для защиты одного глобального списка?
имейте в виду, вы будете так быстро, как ваша самая медленная нить
источник
Я нашел
joblib
очень полезным со мной. Пожалуйста, смотрите следующий пример:n_jobs = -1: использовать все доступные ядра
источник
joblib
.Допустим, у нас есть асинхронная функция
Это должно быть запущено на большом массиве. Некоторые атрибуты передаются в программу, а некоторые используются из свойства элемента словаря в массиве.
источник
Посмотри на это;
http://docs.python.org/library/queue.html
Это может быть неправильный способ сделать это, но я бы сделал что-то вроде;
Актуальный код;
Надеюсь, это поможет.
источник
Это может быть полезно при реализации многопроцессорных и параллельных / распределенных вычислений в Python.
Учебник YouTube по использованию пакета techila
Techila - это промежуточное программное обеспечение для распределенных вычислений, которое напрямую интегрируется с Python с помощью пакета techila. Функция персика в пакете может быть полезна для распараллеливания структур цикла. (Следующий фрагмент кода с форумов сообщества Techila )
источник
спасибо @iuryxavier
источник
очень простой пример параллельной обработки
источник