[Esta es mi primera publicación y espero no haber entendido completamente mal el uso de SE; si es así, me disculpo de antemano]
Estoy de acuerdo con "bgschaid" en que la pregunta es muy difícil de responder según la información proporcionada. Hace una gran diferencia si desea que las rutinas de bajo nivel exploten una arquitectura multinúcleo o si necesita explotar el paralelismo para problemas vergonzosamente paralelos, o algo intermedio. Aquí se puede encontrar una descripción general de las diferentes posibilidades de computación paralela en Python .
En el primer caso, de seguro recomiendo usar herramientas como NumPy / SciPy, que al menos en la versión compilada de MKL de Enthought admite arquitecturas de múltiples núcleos. Aquí puede controlar el número de núcleos a utilizar a través de la variable de entorno "MKL_NUM_THREADS". Esto se basa en bibliotecas altamente optimizadas que difícilmente podemos esperar que superen el rendimiento inteligente. Creo que generalmente se recomienda utilizar estas bibliotecas de alta calidad y altamente optimizadas siempre que sea posible.
Si desea explotar el paralelismo en un nivel aproximado, el multiprocesamiento de la herramienta estándar de Python es fácil de usar, y también admite objetos de datos compartidos. Hay diferentes herramientas para usar como parte del paquete de multiprocesamiento . He usado map_async (como SIMD) y apply_async (como MIMD) para varios problemas con buenos resultados. El paquete de multiprocesamiento es bastante fácil de usar y ser parte estándar de Python significa que puede esperar que otros usuarios potenciales de su código puedan usarlo fácilmente. el multiprocesamiento también se vincula a los objetos de datos NumPy directamente. Cuando se usa multiprocesamientoLe recomendaría que establezca la variable de entorno "MKL_NUM_THREADS" en 1 para que NumPy solo tenga permitido un núcleo para cada proceso / trabajador; de lo contrario, podría terminar en una contención de recursos entre NumPy paralelo y multiprocesamiento que conduce a una degradación del rendimiento. el multiprocesamiento funciona bien para una arquitectura multi-CPU / multi-core bajo el mismo sistema operativo. He utilizado el multiprocesamiento en una computadora con memoria compartida con 4 CPU Xeon E7-4850 (cada 10 núcleos) y 512 GB de memoria y funcionó extremadamente bien. Las matrices compartidas se pueden manejar mediante multiprocesamiento, matriz o tipos compartidos . Puede encontrar la documentación de Python aquí : consulte elarchivo library.pdf . Tengo algunas diapositivas que explican algunas de las partes básicas de esto: envíame un PM si quieres.
Si tiene una configuración de clúster con memoria distribuida, creo que mpi4py es probablemente la herramienta preferida. No lo he usado yo mismo, pero sé que se está usando mucho en la programación paralela de Python.