¿Cuáles son las formas de paralelizar los códigos Python y NumPy?

NumPy por defecto proporciona algunos envoltorios de Python para bibliotecas C subyacentes como BLAS y LAPACK (o ATLAS). Si desea subprocesos múltiples, creo que puede compilar NumPy en diferentes bibliotecas (como MKL). Este chico hizo algunos benchmarking: http://stackoverflow.com/a/76459…

Antes de mirar las implementaciones paralelas, debe mirar un poco más de optimización (en caso de que no lo sepa): PerformancePython – y PerformanceTips –

Lo que puede desear son envoltorios de Python para un paquete de álgebra lineal de alto rendimiento escrito en C o Fortran. Esto existe para sistemas de memoria distribuida en paquetes como PETSc, donde tienen petsc4py. Si necesita eigensolvers, también hay SLEPc y slepc4py (ambos dependen de mpi4py). Sin embargo, se necesita un poco de tiempo para configurarlos.

Además de PETSc, también hay Trilinos y sus envoltorios de Python correspondientes, PyTrilinos: PyTrilinos – Home. Si está buscando GPU, hay PyCUDA: la página web de Andreas Klöckner y ¡Bienvenido a la documentación de PyCUDA!

Aquí hay una muy buena presentación de Python de alto rendimiento: http://www.uni-graz.at/~haasegu/…

Desafortunadamente, no es tan fácil como lo es en MATLAB, pero afortunadamente si dedicas algo de tiempo, obtendrás aceleraciones masivas.

No estoy satisfecho con muchos de estos ejemplos. Me gustaría publicar un código básico que muestre cómo paralelizaría el código usando Módulo de multiprocessing .

El código que nunca necesita cambiar (¡casi nunca!)

 from multiprocessing import Process, Queue, cpu_count class Consumer(Process): def __init__(self, tasks, results): Process.__init__(self) self.tasks = tasks self.results = results def run(self): proc_name = Page on Self while True: next_task = self.tasks.get() if next_task is None: # Poison pill means we should exit break result = next_task() self.results.put(result) return class Task(object): def __init__(self, event): self.event = event def __call__(self): #do actions that execute things you need to run in parallel grid = Grid(pixel_resolution=0.2) grid.add_event(self.event) return self.event#modified self.event def __str__(self): pass 

y así es como implementaría el código anterior

 if __name__ == '__main__': # load up the events events = Events(filename=filename) events.load() processed_events = [] # Establish communication queues tasks, results = Queue(), Queue() # Build up the processes num_consumers = cpu_count() num_tasks = 0 consumers = [ Consumer(tasks, results) for i in range(num_consumers) ] for event in events: tasks.put(Task(event)) num_tasks += 1 # poison pill to stop processing for i in range(num_consumers): tasks.put(None) # start processing for c in consumers: c.start() # wait for all tasks to complete while num_tasks: processed_events.append(results.get())#this should be blocking num_tasks -= 1 # at this point, processed_events is the events array that contains calculated events with no issue analysis = Analysis(processed_events) analysis.Efficiency() 

¡Es muy limpio, fácil de usar y puede adaptarlo a muchos de sus proyectos sin demasiados problemas!

Hay muchas formas, que es la mejor depende de su problema. Aquí hay algunas posibilidades (probablemente hay otras):

– NumPy y SciPy vinculados con bibliotecas BLAS y LAPACK multiproceso (por ejemplo, Intel MKL, Apple Accelerate Framework, OpenBLAS)

– Intel MKL para numpy.fft. * En Enthought Canopy

– multiprocesamiento, os.fork, joblib, concurrent.futures

– enhebrado.Código de hilo y extensión que libera el GIL

– Cython con roscado. Hilo o prange

– PyOpenCL

– PyCUDA

– MPI (por ejemplo, con mpi4py y MPICH u OpenMPI)

– f2py con código Fortran que usa OpenMP

– Cython o ctypes con código C que usa OpenMP

– Numba y prange

– Numba y CUDA

– multihilo en numexpr

Hay un código de ejemplo muy primitivo pero muestra un ejemplo de codificación multiproceso

https://github.com/erogol/Kaggle

También mire las pitones integradas en el módulo

http://docs.python.org/2/library

No conozco ningún soporte central numpy, pero puede haber uno de código abierto.