Comment augmenter l'utilisation du processeur de Python

21

J'utilise Python pour exécuter certains algorithmes et quel que soit le Python que j'utilise, et j'ai essayé de nombreuses versions, l'utilisation du processeur va jusqu'à 25% max. Pourquoi Python ne tire-t-il pas parti du reste de mes ressources CPU? J'ai changé la priorité du service de normal à élevé et plus tard en temps réel, avec des redémarrages entre les deux, mais rien n'a changé.

Existe-t-il un moyen de faire en sorte que Python utilise 50% ou plus de mon processeur?

Christos K.
la source
votre processeur est-il un processeur multicœur?
Journeyman Geek
oui, c'est un i5-480M et dans le panneau de configuration> options d'alimentation> cpu min / max c'est à 100%
Christos K.

Réponses:

20

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, utilisant tout le cœur.

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

Compagnon Geek
la source
J'avais peur que ce soit le cas, mais dans les diagrammes d'utilisation du processeur dans le gestionnaire de tâches Windows, je ne vois pas 1 diagramme sur son choix pendant que l'algorithme est exécuté, au contraire, je les vois tous avec une augmentation significative.
Christos K.
1
Votre système équilibre la charge entre les cœurs. Pourtant, deux cœurs ne sont pas utilisés à la fois.
gronostaj
les gars, vous avez confirmé mes craintes, il semble qu'il est temps que je commence à lire sur le filetage
Christos K.
@ fractal_7: le filetage peut ne pas apporter les avantages escomptés. Voir ma réponse ci-dessous.
Roland Smith
15

Le langage Python est antérieur aux processeurs multicœurs, il n'est donc pas étrange qu'il ne les utilise pas nativement.

De plus, tous les programmes ne peuvent pas bénéficier 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 en utilisant plus de cœurs. Les problèmes qui peuvent être vectorisés (en appliquant le même calcul à de grands tableaux de données) peuvent être relativement faciles à utiliser pour utiliser plusieurs cœurs car les calculs individuels sont indépendants.

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

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

  • Le multiprocessingmodule est intégré. La multiprocessing.Poolclasse fournit une vectorisation sur plusieurs processeurs avec les map()méthodes associées. Il y a cependant un compromis ici. Si vous devez communiquer de grandes quantités de données entre les processus, cette surcharge peut annuler l'avantage de plusieurs cœurs.
  • Utilisez une version appropriée de numpy. Si numpy est construit avec une bibliothèque ATLAS multithreading, il sera plus rapide sur les gros problèmes.
  • Utilisez des modules d'extension comme numexpr , python parallèle , corepy ou Copenhagen Vector Byte Code .

Notez que le threadingmodule n'est pas du tout utile à cet égard. Pour simplifier la gestion de la mémoire, le verrou d'interpréteur global ("GIL") impose qu'un seul thread à la fois puisse exécuter le bytecode python. Les modules externes comme numpy peuvent cependant utiliser plusieurs threads en interne.

Roland Smith
la source
Jusqu'à présent, j'ai utilisé ironpython python 2.7 et essayé pypy. je vais donner une chance à numpy. mais je devrai toujours lire avant de pouvoir utiliser n'importe quel module de multiprocesseur.
Christos K.