Paralelo para bucle en Python

Shivam Arora 30 enero 2023
  1. Utilice el módulo multiprocessing para paralelizar el bucle for en Python
  2. Utilice el módulo joblib para paralelizar el bucle for en Python
  3. Utilice el módulo asyncio para paralelizar el bucle for en Python
Paralelo para bucle 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

Artículo relacionado - Python Loop