Параллельный цикл for в Python

  1. Используйте модуль multiprocessing для распараллеливания цикла for в Python
  2. Используйте модуль joblib для распараллеливания цикла for в Python
  3. Используйте модуль asyncio для распараллеливания цикла for в Python

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

В этой статье мы распараллелим цикл for в Python.

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

Чтобы распараллелить цикл, мы можем использовать пакет multiprocessing в Python, поскольку он поддерживает создание дочернего процесса по запросу другого текущего процесса.

Модуль multiprocessing можно использовать вместо цикла for для выполнения операций над каждым элементом итерации. Можно использовать объект multiprocessing.pool(), поскольку использование нескольких потоков в Python не даст лучших результатов из-за глобальной блокировки интерпретатора.

Например,

import multiprocessing

def sumall(value):
    return sum(range(1, value + 1))

pool_obj = multiprocessing.Pool()

answer = pool_obj.map(sumall,range(0,5))
print(answer)

Выход:

0, 1, 3, 6, 10

Используйте модуль joblib для распараллеливания цикла for в Python

Модуль joblib использует многопроцессорность для запуска нескольких ядер ЦП для выполнения распараллеливания цикла for. Он предоставляет легкий конвейер, который запоминает шаблон для простых и понятных параллельных вычислений.

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

Функция delayed() позволяет нам указать Python, чтобы через некоторое время был вызван конкретный упомянутый метод.

Функция Parallel() создает параллельный экземпляр с указанными ядрами (в данном случае 2).

Нам нужно создать список для выполнения кода. Затем список передается в параллельную систему, которая формирует два потока и раздает им список задач.

См. Код ниже.

from joblib import Parallel, delayed
import math

def sqrt_func(i, j):
    time.sleep(1)
    return math.sqrt(i**j)

Parallel(n_jobs=2)(delayed(sqrt_func)(i, j) for i in range(5) for j in range(2))

Выход:

[1.0,
 0.0,
 1.0,
 1.0,
 1.0,
 1.4142135623730951,
 1.0,
 1.7320508075688772,
 1.0,
 2.0]

Используйте модуль asyncio для распараллеливания цикла for в Python

Модуль asyncio является однопоточным и запускает цикл обработки событий, временно приостанавливая сопрограмму с помощью методов yield from или await.

Приведенный ниже код будет выполняться параллельно при его вызове, не влияя на ожидание основной функции. Цикл также выполняется параллельно с основной функцией.

import asyncio
import time
def background(f):
    def wrapped(*args, **kwargs):
        return asyncio.get_event_loop().run_in_executor(None, f, *args, **kwargs)

    return wrapped

@background
def your_function(argument):
    time.sleep(2)
    print('function finished for '+str(argument))


for i in range(10):
    your_function(i)


print('loop finished')

Выход:

ended execution for 4
ended execution for 8
ended execution for 0
ended execution for 3
ended execution for 6
ended execution for 2
ended execution for 5
ended execution for 7
ended execution for 9
ended execution for 1

Сопутствующая статья - Python Loop

  • Как получить доступ к индексу в Foreach петлях на Python
  • Итерировать в обратном направлении в Python
  • Уменьшение цикла в Python