Python-Interpreter nur mit 12% CPU-Leistung

26

Ich verwende Python auf Ubuntu für die Textanalyse. Trotz des hohen Arbeitsaufwands wird die im Systemmonitor angezeigte CPU-Auslastung konstant bei 12% gehalten.

Ich habe die Priorität des Programms von Normalauf geändert , Very Highaber das hatte keine Auswirkung.

Was schränkt die CPU-Auslastung meines Python-Programms ein und wie kann ich das ändern, damit das Programm mehr CPU-Leistung verbraucht?

Matthias Herrmann
quelle

Antworten:

73

Ich nehme an, Sie haben eine CPU mit 8 virtuellen Kernen (Quad-Core mit Hyper-Threading wahrscheinlich)? Dies bedeutet, dass ein vollständig geladener CPU-Thread / virtueller Kern einer Gesamtlast von 12,5% entspricht.

Der Python-Interpreter ist eine Anwendung, die standardmäßig nur als ein einzelner Prozess ausgeführt wird und daher nicht in der Lage ist, mehr als einen virtuellen Kern zu nutzen. Selbst wenn der Code, den Sie damit ausführen, Multithreading verwendet, wird aufgrund der GIL (Global Interpreter Lock) nur ein CPU-Thread / virtueller Kern verwendet .

Nur wenn Ihr Python-Programm Multiprocessing verwendet , wodurch mehrere Instanzen des Python-Interpreters gestartet und Ihre Aufgaben wirklich parallel ausgeführt werden, können Sie mehrere virtuelle Kerne / CPU-Threads nutzen. (Wie @SargeBorsch in seinem Kommentar betonte, gibt es auch einige fortgeschrittene Möglichkeiten, dies ohne Mehrfachverarbeitung zu erreichen, aber das ist normalerweise nicht etwas, das Sie selbst schnell schreiben.)

Byte Commander
quelle
Das macht tatsächlich sehr viel Sinn. Ja, ich habe einen Quad-Core mit 4 Kernen (8 virtuelle Kerne). Ty
Matthias Herrmann
9
@MatthiasHerrmann Sie könnten einen Systemmonitor in Betracht ziehen, der anzeigt, mit welchem ​​Prozentsatz jede CPU arbeitet. Auf diese Weise konnte man nur 1 von 8 CPUs bei 100% sehen. Hier ist ein Thread in AU zu diesem Thema: Windows-"Gadgets" -Äquivalent (für WLAN- und CPU-Nutzung)?
WinEunuuchs2Unix
7
Nicht wahr, es ist möglich, alle Kerne eines einzelnen Python-Prozesses zu verwenden. Man muss nur C-Code aufrufen und die GIL freigeben. Und viele existierende Bibliotheken machen genau das (zum Beispiel numpy).
Sarge Borsch
2
Oder benutze Jythonoder IronPython, die kein GIL haben.
Hör auf, Monica
19

Eine andere Möglichkeit, die in diesem Fall weniger wahrscheinlich ist, besteht darin, dass das Programm festplattengebunden ist, dh es liest und schreibt langsam auf die Festplatte und die CPU wartet auf die Festplatte.

jmmcd
quelle
5
versuchen iotopzu überwachen Programme gebunden iowait
cat
1
Oder der Code selbst ist synchron und blockierend.
Zydnar
Das war mein Fehler, vielen Dank
Fipsi