Parallel for Loop in Python

Shivam Arora 21 dicembre 2022
  1. Usa il modulo multiprocessing per parallelizzare il cicli for in Python
  2. Usa il modulo joblib per parallelizzare il cicli for in Python
  3. Usa il modulo asyncio per parallelizzare il cicli for in Python
Parallel for Loop in Python

Parallelizzare il bucle significa distribuire tutti i processi in parallelo utilizzando più core. Quando abbiamo numerosi lavori, ogni calcolo non attende il completamento di quello precedente in elaborazione parallela. Invece, utilizza un processore diverso per il completamento.

In questo articolo, parallelizzeremo un bucle for in Python.

Usa il modulo multiprocessing per parallelizzare il cicli for in Python

Per parallelizzare il bucle, possiamo utilizzare il pacchetto multiprocessing in Python poiché supporta la creazione di un processo figlio tramite la richiesta di un altro processo in corso.

Il modulo multiprocessing potrebbe essere utilizzato al posto del bucle for per eseguire operazioni su ogni elemento dell’iterabile. È possibile utilizzare l’oggetto multiprocessing.pool(), poiché l’utilizzo di più thread in Python non darebbe risultati migliori a causa del blocco globale dell’interprete.

Per esempio,

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)

Produzione:

0, 1, 3, 6, 10

Usa il modulo joblib per parallelizzare il cicli for in Python

Il modulo joblib utilizza il multiprocessing per eseguire più core della CPU per eseguire la parallelizzazione del cicli for. Fornisce una pipeline leggera che memorizza il modello per un calcolo parallelo facile e diretto.

Per eseguire l’elaborazione parallela, dobbiamo impostare il numero di lavori e il numero di lavori è limitato al numero di core nella CPU o quanti sono disponibili o inattivi al momento.

La funzione delayed() ci permette di dire a Python di chiamare un particolare metodo menzionato dopo un po’ di tempo.

La funzione Parallel() crea un’istanza parallela con core specificati (2 in questo caso).

Dobbiamo creare una lista per l’esecuzione del codice. Quindi la lista viene passato a parallel, che sviluppa due thread e distribuisce loro la lista delle attività.

Vedi il codice qui sotto.

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))

Produzione:

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

Usa il modulo asyncio per parallelizzare il cicli for in Python

Il modulo asyncio è a thread singolo ed esegue l’event loop sospendendo temporaneamente la coroutine utilizzando i metodi yield from o await.

Il codice seguente verrà eseguito in parallelo quando viene chiamato senza influire sulla funzione principale di attesa. Il bucle viene eseguito anche in parallelo con la funzione principale.

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")

Produzione:

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

Articolo correlato - Python Loop