So erhöhen Sie die CPU-Auslastung von Python


21

Ich verwende Python, um einige Algorithmen auszuführen, und egal, welches Python ich verwende, und ich habe viele Versionen ausprobiert, die CPU-Auslastung beträgt maximal 25%. Warum nutzt Python den Rest meiner CPU-Ressourcen nicht aus? Ich habe die Priorität des Dienstes von "Normal" auf "Hoch" und später auf "Echtzeit" geändert. Zwischendurch wurden Neustarts durchgeführt, aber nichts hat sich geändert.

Gibt es eine Möglichkeit, Python dazu zu bringen, 50% oder sogar mehr meiner CPU zu nutzen?


Ist Ihre CPU eine Multicore-CPU?
Geselle Geek

ja, es ist ein i5-480M und in der Systemsteuerung> Energieoptionen> CPU min / max ist es bei 100%
Christos K.

Antworten:


20

Ganz einfach, Sie führen eine einzelne Thread-Anwendung in einem System mit 4 logischen Kernen aus - als solche haben Sie einen Prozess, bei dem der gesamte Kern verwendet wird.

Sie müssen (und das ist nicht trivial) den Algorithmus neu schreiben, um mehrere Threads auszuführen, oder Sie müssen überprüfen, ob Sie nur zwei oder mehr Instanzen auf bestimmten Kernen ausführen können, um mehr von Ihrer CPU zu verbrauchen. Es gibt keinen anderen Weg.


Ich befürchtete, dass dies der Fall sein würde, aber in CPU-Nutzungsdiagrammen im Windows-Task-Manager sehe ich nicht, dass 1 Diagramm auf seiner Auswahl ist, während der Algorithmus ausgeführt wird, im Gegenteil, ich sehe alle mit einer signifikanten Zunahme.
Christos K.

1
Ihr System verteilt die Last zwischen den Kernen. Es werden jedoch keine zwei Kerne gleichzeitig verwendet.
Gronostaj

Jungs, Sie haben meine Befürchtungen bestätigt, es scheint, dass es an der Zeit ist, dass ich anfange, über das Threading zu lesen
Christos K.

@ fractal_7: Threading bietet möglicherweise nicht die erwarteten Vorteile. Siehe meine Antwort unten.
Roland Smith

15

Die Python-Sprache ist älter als Multi-Core-CPUs, daher ist es nicht ungewöhnlich, dass sie nicht von Haus aus verwendet wird.

Darüber hinaus können nicht alle Programme von mehreren Kernen profitieren. Eine Berechnung in Schritten, bei der der nächste Schritt von den Ergebnissen des vorherigen Schritts abhängt, ist mit mehr Kernen nicht schneller. Probleme, die vektorisiert werden können (Anwenden derselben Berechnung auf große Datenfelder), können relativ leicht zur Verwendung mehrerer Kerne gemacht werden, da die einzelnen Berechnungen unabhängig sind.

Wenn Sie viele Berechnungen durchführen, gehe ich davon aus, dass Sie Numpy verwenden ? Wenn nicht, probieren Sie es aus. Es ist eine in C geschriebene Erweiterung, die optimierte lineare Algebra-Bibliotheken wie ATLAS verwenden kann. Dies kann numerische Berechnungen im Vergleich zu Standard-Python erheblich beschleunigen.

Allerdings gibt es mehrere Möglichkeiten, mehrere Kerne mit Python zu verwenden.

  • Eingebaut ist das multiprocessingModul. Die multiprocessing.PoolKlasse bietet Vektorisierung über mehrere CPUs mit den map()und verwandten Methoden. Hier gibt es allerdings einen Kompromiss. Wenn Sie große Datenmengen zwischen den Prozessen übertragen müssen, kann dieser Overhead den Vorteil mehrerer Kerne zunichte machen.
  • Verwenden Sie einen geeigneten Build von Numpy. Wenn numpy mit einer Multithreading-ATLAS-Bibliothek erstellt wird, ist dies bei großen Problemen schneller.
  • Verwenden Sie Erweiterungsmodule wie numexpr , paralleles Python , Corepy oder Copenhagen Vector Byte Code .

Beachten Sie, dass das threadingModul in dieser Hinsicht nicht allzu nützlich ist. Um die Speicherverwaltung einfach zu halten, erzwingt die globale Interpretersperre ("GIL"), dass jeweils nur ein Thread Python-Bytecode ausführen kann. Externe Module wie numpy können jedoch intern mehrere Threads verwenden.


Bisher habe ich Python 2.7 Ironpython verwendet und versucht, Python. Ich gebe Numpy eine Chance. Aber ich muss trotzdem lesen, bevor ich ein Multiprocessing-Modul verwenden kann.
Christos K.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.