Para C ++, podemos usar OpenMP para hacer programación paralela; sin embargo, OpenMP no funcionará para Python. ¿Qué debo hacer si quiero poner en paralelo algunas partes de mi programa de Python?
La estructura del código puede considerarse como:
solve1(A)
solve2(B)
Donde solve1
y solve2
son dos funciones independientes. ¿Cómo ejecutar este tipo de código en paralelo en lugar de en secuencia para reducir el tiempo de ejecución? Espero que alguien pueda ayudarme. Muchas gracias de antemano. El codigo es:
def solve(Q, G, n):
i = 0
tol = 10 ** -4
while i < 1000:
inneropt, partition, x = setinner(Q, G, n)
outeropt = setouter(Q, G, n)
if (outeropt - inneropt) / (1 + abs(outeropt) + abs(inneropt)) < tol:
break
node1 = partition[0]
node2 = partition[1]
G = updateGraph(G, node1, node2)
if i == 999:
print "Maximum iteration reaches"
print inneropt
Donde setinner y setouter son dos funciones independientes. Ahí es donde quiero paralelo ...
python
parallel-processing
ilovecp3
fuente
fuente
Respuestas:
Puede usar el módulo de multiprocesamiento . Para este caso, podría usar un grupo de procesamiento:
Esto generará procesos que pueden hacer un trabajo genérico para usted. Como no lo aprobamos
processes
, generará un proceso para cada núcleo de CPU en su máquina. Cada núcleo de CPU puede ejecutar un proceso simultáneamente.Si desea asignar una lista a una sola función, debe hacer esto:
No use hilos porque el GIL bloquea cualquier operación en objetos python.
fuente
pool.map
también acepta diccionarios como args? ¿O solo listas simples?Esto se puede hacer de manera muy elegante con Ray .
Para paralelizar su ejemplo, necesitaría definir sus funciones con el
@ray.remote
decorador y luego invocarlas con.remote
.Hay varias ventajas de esto sobre el módulo de multiprocesamiento .
Estas llamadas a funciones se pueden componer juntas, por ejemplo,
Tenga en cuenta que Ray es un marco que he estado ayudando a desarrollar.
fuente
pip
. Sugeriría intentarlopip install --upgrade pip
. Si necesita usarlosudo
, es posible que la versiónpip
que está utilizando para instalarray
no sea la misma que se está actualizando. Puedes consultar conpip --version
. Además, Windows no es compatible actualmente, por lo que si está en Windows, ese es probablemente el problema.CPython utiliza el bloqueo global de intérprete que hace que la programación paralela sea un poco más interesante que C ++
Este tema tiene varios ejemplos útiles y descripciones del desafío:
¿Solución de Python Global Interpreter Lock (GIL) en sistemas multinúcleo que utilizan el conjunto de tareas en Linux?
fuente
La solución, como han dicho otros, es utilizar múltiples procesos. Sin embargo, qué marco es más apropiado depende de muchos factores. Además de los ya mencionados, también hay charm4py y mpi4py (soy el desarrollador de charm4py).
Hay una forma más eficiente de implementar el ejemplo anterior que usar la abstracción del grupo de trabajo. El bucle principal envía los mismos parámetros (incluido el gráfico completo
G
) una y otra vez a los trabajadores en cada una de las 1000 iteraciones. Como al menos un trabajador residirá en un proceso diferente, esto implica copiar y enviar los argumentos a los otros procesos. Esto podría ser muy costoso dependiendo del tamaño de los objetos. En cambio, tiene sentido que los trabajadores almacenen el estado y simplemente envíen la información actualizada.Por ejemplo, en charm4py esto se puede hacer así:
Tenga en cuenta que para este ejemplo realmente solo necesitamos un trabajador. El bucle principal podría ejecutar una de las funciones y hacer que el trabajador ejecute la otra. Pero mi código ayuda a ilustrar un par de cosas:
result_a.get()
está bloqueado esperando el resultado, el trabajador A realiza el cálculo en el mismo proceso.fuente
En algunos casos, es posible paralelizar automáticamente los bucles usando Numba , aunque solo funciona con un pequeño subconjunto de Python:
Desafortunadamente, parece que Numba solo funciona con matrices Numpy, pero no con otros objetos de Python. En teoría, también podría ser posible compilar Python a C ++ y luego paralelizarlo automáticamente usando el compilador Intel C ++ , aunque todavía no lo he intentado.
fuente
Puede usar la
joblib
biblioteca para hacer cómputo paralelo y multiprocesamiento.Simplemente puede crear una función
foo
que desee que se ejecute en paralelo y en función del siguiente código: implementar el procesamiento en paralelo:Donde
num_cores
se puede obtener de lamultiprocessing
biblioteca de la siguiente manera:Si tiene una función con más de un argumento de entrada y solo desea iterar sobre uno de los argumentos por una lista, puede usar la
partial
función de lafunctools
biblioteca de la siguiente manera:Puede encontrar una explicación completa del multiprocesamiento python y R con un par de ejemplos aquí .
fuente