it-swarm.com.de

So erhöhen Sie die Python-CPU-Auslastung

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?

20
Christos K.

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 prü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.

19
Journeyman Geek

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 Modul multiprocessing. Die Klasse multiprocessing.Pool bietet Vektorisierung über mehrere CPUs mit der Funktion 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 ATLAS-Bibliothek mit mehreren Threads 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 Modul threading 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.

13
Roland Smith