Paralelo para bucle en Python
-
Utilice el módulo
multiprocessing
para paralelizar el buclefor
en Python -
Utilice el módulo
joblib
para paralelizar el buclefor
en Python -
Utilice el módulo
asyncio
para paralelizar el buclefor
en Python
Paralelizar el bucle significa distribuir todos los procesos en paralelo utilizando múltiples núcleos. Cuando tenemos numerosos trabajos, cada cálculo no espera a que se complete el anterior en procesamiento paralelo. En cambio, utiliza un procesador diferente para completar.
En este artículo, paralelizaremos un bucle for
en Python.
Utilice el módulo multiprocessing
para paralelizar el bucle for
en Python
Para paralelizar el bucle, podemos usar el paquete multiprocessing
en Python, ya que admite la creación de un proceso hijo mediante la solicitud de otro proceso en curso.
El módulo de multiprocessing
podría usarse en lugar del bucle for para ejecutar operaciones en cada elemento del iterable. Su objeto multiprocessing.pool()
podría usarse, ya que usar múltiples subprocesos en Python no daría mejores resultados debido al bloqueo de intérprete global.
Por ejemplo,
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)
Producción :
0, 1, 3, 6, 10
Utilice el módulo joblib
para paralelizar el bucle for
en Python
El módulo joblib
utiliza multiprocesamiento para ejecutar múltiples núcleos de CPU para realizar la paralelización del bucle for
. Proporciona una tubería liviana que memoriza el patrón para un cálculo paralelo fácil y directo.
Para realizar el procesamiento en paralelo, tenemos que establecer el número de trabajos, y el número de trabajos está limitado al número de núcleos en la CPU o cuántos están disponibles o inactivos en este momento.
La función delayed()
nos permite decirle a Python que llame a un método mencionado en particular después de un tiempo.
La función Parallel()
crea una instancia paralela con núcleos especificados (2 en este caso).
Necesitamos crear una lista para la ejecución del código. Luego, la lista se pasa a paralelo, que desarrolla dos subprocesos y les distribuye la lista de tareas.
Vea el código a continuación.
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))
Producción :
[1.0,
0.0,
1.0,
1.0,
1.0,
1.4142135623730951,
1.0,
1.7320508075688772,
1.0,
2.0]
Utilice el módulo asyncio
para paralelizar el bucle for
en Python
El módulo asyncio
es de un solo subproceso y ejecuta el bucle de eventos suspendiendo la corrutina temporalmente usando los métodos yield from
o await
.
El siguiente código se ejecutará en paralelo cuando se llame sin afectar la función principal para esperar. El bucle también se ejecuta en paralelo con la función principal.
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")
Producción :
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