[Este é meu primeiro post e espero não ter entendido completamente o uso do SE - se assim for, peço desculpas antecipadamente]
Eu concordo com "bgschaid" que a pergunta é muito difícil de responder com base nas informações fornecidas. Faz uma enorme diferença se você deseja que rotinas de baixo nível explorem uma arquitetura de vários núcleos ou se você precisa explorar o paralelismo para problemas embaraçosamente paralelos - ou algo intermediário. Uma visão geral das diferentes possibilidades de computação paralela no Python pode ser encontrada aqui .
No primeiro caso, com certeza recomendo usar ferramentas como o NumPy / SciPy que, pelo menos na versão compilada MKL da Enthought, suporta arquiteturas de vários núcleos. Aqui você pode controlar o número de núcleos a serem usados através da variável de ambiente "MKL_NUM_THREADS". Isso depende de bibliotecas altamente otimizadas que dificilmente podemos esperar que superem o desempenho. Eu acredito que geralmente é aconselhável usar essas bibliotecas de alta qualidade e altamente otimizadas sempre que possível.
Se você deseja explorar o paralelismo em um nível aproximado, o multiprocessamento padrão da ferramenta Python é fácil de usar - e também suporta objetos de dados compartilhados. Existem diferentes ferramentas para usar como parte do pacote de multiprocessamento . Eu usei map_async (como SIMD) e apply_async (como MIMD) para vários problemas com bons resultados. O pacote de multiprocessamento é bastante fácil de usar e, como parte padrão do Python, significa que você pode esperar que outros usuários em potencial do seu código possam utilizá-lo facilmente. o multiprocessamento também vincula diretamente aos objetos de dados NumPy. Ao usar o multiprocessamentoEu recomendo que você defina a variável de ambiente "MKL_NUM_THREADS" como 1, de modo que o NumPy seja permitido apenas um núcleo para cada processo / trabalhador - caso contrário, você poderá acabar em uma contenção de recursos entre o NumPy e o multiprocessamento, o que leva a uma degradação no desempenho. O multiprocessamento funciona bem para uma arquitetura com várias CPUs / núcleos no mesmo sistema operacional. Usei o multiprocessamento em um computador com memória compartilhada com 4 CPUs Xeon E7-4850 (cada 10 núcleos) e 512 GB de memória e funcionou extremamente bem. Matrizes compartilhadas podem ser manipuladas por multiprocessing.Array ou sharedctypes . Você pode encontrar a documentação do Python aqui - verifique oarquivo library.pdf . Eu tenho alguns slides explicando algumas das partes básicas disso - PM me, se você quiser.
Se você tiver uma configuração de cluster com memória distribuída, acredito que o mpi4py seja provavelmente a ferramenta preferida. Eu não usei isso sozinho, mas sei que ele está sendo muito usado na programação paralela do Python.