Python Interpreter utilizza solo il 12% di potenza della CPU


26

Sto usando Python su Ubuntu per l'analisi del testo. Nonostante la grave mole di lavoro svolto dal programma, l'utilizzo della CPU, come mostrato nel monitor di sistema, rimane costantemente al 12%.

Ho cambiato la priorità del programma da Normala Very Highma questo non ha avuto effetto.

Cosa sta limitando la quantità di utilizzo della CPU che il mio programma python può ottenere e come posso cambiarlo, in modo che il programma possa utilizzare più potenza della CPU?

Risposte:


73

Presumo che tu abbia una CPU con 8 core virtuali (probabilmente quad-core con hyper-threading)? Ciò significa che un thread CPU / core virtuale completamente caricato equivale al carico totale del 12,5%.

L'interprete Python è un'applicazione che viene eseguita come un singolo processo per impostazione predefinita e non è quindi in grado di sfruttare più di un core virtuale. Anche se il codice eseguito con esso utilizza il multithreading, utilizzerà comunque solo un thread CPU / core virtuale, a causa del GIL (blocco dell'interprete globale) .

Solo se il tuo programma Python utilizza il multiprocessing , che in effetti avvia più istanze dell'interprete Python e consente loro di svolgere le tue attività in modo veramente parallelo, puoi sfruttare più core virtuali / thread CPU. (Come ha sottolineato @SargeBorsch nel suo commento, ci sono anche alcuni modi avanzati per raggiungere questo obiettivo senza multiprocessing, ma di solito non è qualcosa che ti scrivi rapidamente.)


Questo in realtà ha molto senso. Sì, sto avendo un quad-core con 4 core (8 core virtuali). Ty
Matthias Herrmann,

9
@MatthiasHerrmann Potresti prendere in considerazione un monitor di sistema che ti mostri in quale percentuale opera ciascuna CPU. In questo modo avresti potuto vedere solo 1 su 8 CPU era al 100%. Ecco un thread in AU sull'argomento: equivalente a "gadget" di Windows (per l'utilizzo di wifi e cpu)?
WinEunuuchs2Unix il

7
Non è vero, è possibile utilizzare tutti i core dal singolo processo Python. Basta chiamare il codice C e rilasciare il GIL. E molte librerie esistenti fanno esattamente questo (ad esempio numpy).
Sarge Borsch,

2
Oppure usa Jythono IronPython, che non ha un GIL.
Smetti di fare del male a Monica il

19

Un'altra possibilità, meno probabile in questo caso, è che il programma sia associato al disco, ovvero che stia leggendo e scrivendo sul / dal disco che è lento e che la CPU è in attesa del disco.


5
prova iotopa monitorare i programmi associati a iowait
cat

1
Oppure il codice stesso è sincrono e bloccante.
Zydnar,

Questo è stato il mio errore grazie mille
Fipsi il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.