Parallel for Loop in Python
-
Usa il modulo
multiprocessing
per parallelizzare il ciclifor
in Python -
Usa il modulo
joblib
per parallelizzare il ciclifor
in Python -
Usa il modulo
asyncio
per parallelizzare il ciclifor
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