Esta es probablemente una pregunta trivial, pero ¿cómo puedo paralelizar el siguiente ciclo en python?
# setup output lists
output1 = list()
output2 = list()
output3 = list()
for j in range(0, 10):
# calc individual parameter value
parameter = j * offset
# call the calculation
out1, out2, out3 = calc_stuff(parameter = parameter)
# put results into correct output list
output1.append(out1)
output2.append(out2)
output3.append(out3)
Sé cómo iniciar subprocesos individuales en Python, pero no sé cómo "recopilar" los resultados.
Múltiples procesos también estarían bien, lo que sea más fácil para este caso. Actualmente estoy usando Linux, pero el código también debería ejecutarse en Windows y Mac.
¿Cuál es la forma más fácil de paralelizar este código?
fuente
calc_stuff
?multiprocessing
módulo para obtener ejemplos más completos.Pool.map()
básicamente funciona comomap()
, pero en paralelo.Para paralelizar un bucle for simple, joblib aporta mucho valor al uso sin procesar del multiprocesamiento. No solo la sintaxis corta, sino también cosas como el agrupamiento transparente de iteraciones cuando son muy rápidas (para eliminar la sobrecarga) o la captura del rastreo del proceso secundario, para tener un mejor informe de errores.
Descargo de responsabilidad: soy el autor original de joblib.
fuente
Realmente me gusta
concurrent.futures
para esto, disponible en Python3 desde la versión 3.2 , y a través de backport a 2.6 y 2.7 en PyPi .Puede usar hilos o procesos y usar exactamente la misma interfaz.
Multiprocesamiento
Ponga esto en un archivo - futuretest.py:
Y aquí está el resultado:
Multithreading
Ahora cambie
ProcessPoolExecutor
aThreadPoolExecutor
, y ejecutar el módulo nuevo:¡Ahora ha realizado múltiples subprocesos y multiprocesamiento!
Nota sobre el rendimiento y el uso de ambos juntos.
El muestreo es demasiado pequeño para comparar los resultados.
Sin embargo, sospecho que el subprocesamiento múltiple será más rápido que el multiprocesamiento en general, especialmente en Windows, ya que Windows no admite la bifurcación, por lo que cada nuevo proceso debe tomarse un tiempo para iniciarse. En Linux o Mac, probablemente estarán más cerca.
Puede anidar múltiples subprocesos dentro de múltiples procesos, pero se recomienda no usar múltiples subprocesos para separar varios procesos.
fuente
Lo anterior funciona muy bien en mi máquina (Ubuntu, el paquete joblib fue preinstalado, pero se puede instalar a través de
pip install joblib
).Tomado de https://blog.dominodatalab.com/simple-parallelization/
fuente
Existen varias ventajas al usar Ray :
En su caso, puede iniciar Ray y definir una función remota
y luego invocarlo en paralelo
Para ejecutar el mismo ejemplo en un clúster, la única línea que cambiaría sería la llamada a ray.init (). La documentación relevante se puede encontrar aquí .
Tenga en cuenta que estoy ayudando a desarrollar Ray.
fuente
¡Esta es la forma más fácil de hacerlo!
Puedes usar asyncio . (La documentación se puede encontrar aquí ). Se utiliza como base para múltiples marcos asincrónicos de Python que proporcionan servidores de red y web de alto rendimiento, bibliotecas de conexión de bases de datos, colas de tareas distribuidas, etc. Además, tiene API de alto y bajo nivel para resolver cualquier tipo de problema. .
Ahora esta función se ejecutará en paralelo cada vez que se llame sin poner el programa principal en estado de espera. Puede usarlo para paralelizar for loop también. Cuando se solicita un bucle for, aunque el bucle es secuencial, cada iteración se ejecuta en paralelo al programa principal tan pronto como llega el intérprete. Por ejemplo:
Esto produce la siguiente salida:
fuente
wrapped()
y debería estar en**kwargs
lugar de*kwargs
¿Por qué no utiliza hilos y un mutex para proteger una lista global?
ten en cuenta que serás tan rápido como tu hilo más lento
fuente
Encontré que
joblib
es muy útil conmigo. Por favor vea el siguiente ejemplo:n_jobs = -1: usa todos los núcleos disponibles
fuente
joblib
.Digamos que tenemos una función asíncrona
Eso debe ejecutarse en una gran matriz. Algunos atributos se pasan al programa y otros se usan desde la propiedad del elemento del diccionario en la matriz.
fuente
Echa un vistazo a esto;
http://docs.python.org/library/queue.html
Puede que esta no sea la forma correcta de hacerlo, pero haría algo como;
Código actual;
Espero que ayude.
fuente
Esto podría ser útil al implementar multiprocesamiento y computación paralela / distribuida en Python.
Tutorial de YouTube sobre el uso del paquete techila
Techila es un middleware informático distribuido, que se integra directamente con Python utilizando el paquete techila. La función de melocotón en el paquete puede ser útil para paralelizar estructuras de bucle. (El siguiente fragmento de código es de los foros de la comunidad de Techila )
fuente
gracias @iuryxavier
fuente
ejemplo muy simple de procesamiento paralelo es
fuente