Interpréteur Python utilisant uniquement 12% de puissance CPU

26

J'utilise python sur ubuntu pour l'analyse de texte. Malgré la lourde quantité de travail que le programme fait, l'utilisation du processeur comme indiqué dans le moniteur système reste constamment à 12%.

J'ai changé la priorité du programme de Normalà Very Highmais cela n'a eu aucun effet.

Qu'est-ce qui limite la quantité d'utilisation du processeur que mon programme Python peut obtenir et comment puis-je changer cela, afin que le programme puisse utiliser plus de puissance CPU?

Matthias Herrmann
la source

Réponses:

73

Je suppose que vous avez un processeur avec 8 cœurs virtuels (quad-core avec hyper-threading probablement)? Cela signifie qu'un thread CPU / noyau virtuel entièrement chargé équivaut à 12,5% de la charge totale.

L'interpréteur Python est une application qui ne s'exécute que comme un seul processus par défaut et n'est donc pas en mesure de tirer parti de plusieurs cœurs virtuels. Même si le code que vous exécutez avec lui utilise le multithreading, il n'utilisera toujours qu'un seul thread CPU / noyau virtuel, en raison du GIL (Global Interpreter Lock) .

Ce n'est que si votre programme Python utilise le multitraitement , qui démarre en fait plusieurs instances de l'interpréteur Python et leur permet d'effectuer vos tâches vraiment en parallèle, que vous pouvez tirer parti de plusieurs cœurs virtuels / threads CPU. (Comme @SargeBorsch l'a souligné dans son commentaire, il existe également des moyens avancés pour y parvenir sans multitraitement, mais ce n'est normalement pas quelque chose que vous écrivez rapidement vous-même.)

Byte Commander
la source
Cela a en fait beaucoup de sens. Oui, j'ai un quad-core avec 4 cœurs (8 cœurs virtuels). Ty
Matthias Herrmann
9
@MatthiasHerrmann Vous pouvez envisager un moniteur système pour vous montrer à quel pourcentage fonctionne chaque CPU. De cette façon, vous n'auriez pu voir que 1 CPU sur 8 à 100%. Voici un fil conducteur en AU sur le sujet: Windows "gadgets" équivalent (pour une utilisation wifi et cpu)?
WinEunuuchs2Unix
7
Ce n'est pas vrai, il est possible d'utiliser très bien tous les cœurs d'un processus python unique. Il suffit d'appeler le code C et de libérer le GIL. Et de nombreuses bibliothèques existantes font exactement cela (numpy par exemple).
Sarge Borsch
2
Ou utilisez Jythonou IronPython, qui n'ont pas de GIL.
Arrêtez de nuire à Monica
19

Une autre possibilité, moins probable dans ce cas, est que le programme est lié au disque, c'est-à-dire qu'il lit et écrit sur / depuis le disque, ce qui est lent, et que le CPU attend le disque.

jmmcd
la source
5
essayez iotopde surveiller les programmes liés à iowait
cat
1
Ou le code lui-même est synchrone et bloquant.
Zydnar
Ce fut mon erreur merci beaucoup
Fipsi