web-dev-qa-db-fra.com

Comment augmenter l'utilisation du processeur Python

J'utilise Python pour exécuter certains algorithmes et peu importe le Python que j'utilise, et j'ai essayé de nombreuses versions, l'utilisation du processeur atteint 25% maximum. Pourquoi Python ne profite-t-il pas du reste des ressources de mon processeur? J'ai changé la priorité du service de normal à élevé et, plus tard, au temps réel, avec des redémarrages entre les deux, mais rien n'a changé.

Est-il possible de faire en sorte que Python utilise 50% ou plus de mon processeur?

20
Christos K.

Tout simplement, vous exécutez une application à thread unique dans un système avec 4 cœurs logiques - en tant que tel, vous avez un processus qui utilise tous les cœurs.

Vous devrez (ce qui n'est pas trivial) devoir réécrire l'algorithme pour qu'il soit multi-thread, ou voir si vous pouvez simplement exécuter 2 instances ou plus, sur des cœurs spécifiques pour utiliser davantage de votre processeur. Il n'y a pas d'autre chemin.

19
Journeyman Geek

Le langage Python étant antérieur aux processeurs multicœurs, il n’est donc pas étrange de ne pas les utiliser de manière native.

De plus, tous les programmes ne peuvent pas tirer profit de plusieurs cœurs. Un calcul effectué par étapes, où l'étape suivante dépend des résultats de l'étape précédente, ne sera pas plus rapide si vous utilisez plus de cœurs. Il est relativement facile d'utiliser des cœurs car les problèmes pouvant être vectorisés (appliquer le même calcul à de grands ensembles de données) peuvent être facilement utilisés, car les calculs individuels sont indépendants.

Lorsque vous faites beaucoup de calculs, je suppose que vous utilisez numpy ? Sinon, jetez-y un coup d'œil. C'est une extension écrite en C qui peut utiliser des bibliothèques optimisées d'algèbre linéaire telles qu'ATLAS. Il peut considérablement accélérer les calculs numériques par rapport au Python standard.

Cela dit, il existe plusieurs façons d’utiliser plusieurs cœurs avec Python.

  • Le module multiprocessing est intégré. La classe multiprocessing.Pool permet la vectorisation sur plusieurs processeurs à l'aide de map() et des méthodes associées. Il y a cependant un compromis à faire ici. Si vous devez communiquer de grandes quantités de données entre les processus, cette surcharge risque de compromettre les avantages de la présence de plusieurs cœurs.
  • Utilisez une version appropriée de Numpy. Si numpy est construit avec une bibliothèque ATLAS multithreading, le problème sera plus rapide.
  • Utilisez des modules d’extension tels que numexpr , python parallèle , corepy ou Code d’octets vectoriel Copenhague .

Notez que le module threading n'est pas si utile à cet égard. Pour que la gestion de la mémoire reste simple, le verrou d'interprète global ("GIL") impose qu'un seul thread à la fois puisse exécuter du bytecode python. Les modules externes tels que numpy peuvent utiliser plusieurs threads en interne, cependant.

13
Roland Smith