[Ceci est mon premier message et j'espère que je n'ai pas complètement mal compris l'utilisation de SE - si c'est le cas, je m'excuse à l'avance]
Je suis d'accord avec "bgschaid" qu'il est très difficile de répondre à la question sur la base des informations fournies. Cela fait une énorme différence si vous voulez que les routines de bas niveau exploitent une architecture multicœur ou si vous devez exploiter le parallélisme pour des problèmes embarrassants parallèles - ou quelque chose entre les deux. Un aperçu des différentes possibilités de calcul parallèle en Python peut être trouvé ici .
Dans le premier cas, je recommande à coup sûr d'utiliser des outils tels que NumPy / SciPy qui, au moins dans la version compilée MKL d'Enthought, prend en charge les architectures multicœurs. Ici, vous pouvez contrôler le nombre de cœurs à utiliser via la variable d'environnement "MKL_NUM_THREADS". Cela repose sur des bibliothèques hautement optimisées que nous pouvons difficilement espérer battre en termes de performances. Je pense qu'il est généralement conseillé d'utiliser ces bibliothèques de haute qualité et hautement optimisées dans la mesure du possible.
Si vous souhaitez exploiter le parallélisme à un niveau grossier, le multi -traitement de l' outil standard Python est facile à utiliser - et il prend également en charge les objets de données partagés. Il existe différents outils à utiliser dans le cadre du package de multitraitement . J'ai utilisé map_async (comme SIMD) et apply_async (comme MIMD) pour plusieurs problèmes avec de bons résultats. Le package multiprocessing est assez facile à utiliser et étant une partie standard de Python, vous pouvez vous attendre à ce que d'autres utilisateurs potentiels de votre code puissent facilement l'utiliser. le multitraitement relie également directement aux objets de données NumPy. Lors de l'utilisation du multitraitementJe vous recommande de définir la variable d'environnement "MKL_NUM_THREADS" sur 1 de telle sorte que NumPy ne soit autorisé qu'à un cœur pour chaque processus / travailleur - sinon vous pourriez vous retrouver dans un conflit de ressources entre NumPy parallèle et multiprocessing, ce qui entraîne une dégradation des performances. le multiprocessing fonctionne très bien pour une architecture multi-CPU / multi-core sous le même système d'exploitation. J'ai utilisé le multitraitement sur un ordinateur à mémoire partagée avec 4 processeurs Xeon E7-4850 (10 cœurs chacun) et 512 Go de mémoire et cela fonctionnait extrêmement bien. Les tableaux partagés peuvent être gérés par multiprocessing.Array ou sharedctypes . Vous pouvez trouver la documentation Python ici - consultez lefichier library.pdf . J'ai quelques diapositives expliquant certaines des parties de base de ceci - PM moi si vous les voulez.
Si vous avez une configuration en cluster avec de la mémoire distribuée, je pense que mpi4py est probablement l'outil préféré. Je ne l'ai pas utilisé moi-même mais je sais qu'il est beaucoup utilisé dans la programmation parallèle Python.