Intérprete Python usando apenas 12% de potência da CPU

26

Estou usando python no ubuntu para análise de texto. Apesar da grande quantidade de trabalho, o programa está fazendo o uso da CPU, conforme mostrado no monitor do sistema, permanece consistentemente em 12%.

Mudei a prioridade do programa de Normalpara, Very Highmas isso não teve efeito.

O que limita a quantidade de uso da CPU que meu programa python pode obter e como posso mudar isso, para que o programa possa utilizar mais energia da CPU?

Matthias Herrmann
fonte

Respostas:

73

Suponho que você tenha uma CPU com 8 núcleos virtuais (provavelmente com quad-core com hyper-threading)? Isso significa que um thread / núcleo virtual da CPU totalmente carregado é igual a 12,5% da carga total.

O interpretador Python é um aplicativo que é executado apenas como um único processo por padrão e, portanto, não é capaz de tirar proveito de mais de um núcleo virtual. Mesmo que o código que você executa com ele use multithreading, ele ainda usará apenas um encadeamento da CPU / núcleo virtual, devido ao GIL (bloqueio global de intérpretes) .

Somente se o seu programa Python usar multiprocessamento , que de fato inicia várias instâncias do interpretador Python e permite que eles executem suas tarefas verdadeiramente paralelas, você pode tirar proveito de vários núcleos virtuais / threads de CPU. (Como o @SargeBorsch apontou em seu comentário, também existem algumas maneiras avançadas de conseguir isso sem multiprocessamento, mas isso normalmente não é algo que você escreve rapidamente.)

Byte Commander
fonte
Isso realmente faz muito sentido. Sim, eu estou tendo um quad-core com 4 núcleos (8 núcleos virtuais). Ty
Matthias Herrmann
9
@MatthiasHerrmann Você pode considerar um monitor de sistema para mostrar em que porcentagem cada CPU está operando. Dessa forma, você poderia ver apenas 1 de 8 CPUs em 100%. Aqui está um tópico na AU sobre o assunto: Windows “gadgets” equivalente (para uso de wifi e cpu)?
WinEunuuchs2Unix
7
Não é verdade, é possível usar todos os núcleos do processo python único. Basta ligar para o código C e liberar o GIL. E muitas bibliotecas existentes fazem exatamente isso (numpy por exemplo).
Sarge Borsch
2
Ou use Jythonor IronPython, que não possui um GIL.
Pare de prejudicar Monica
19

Outra possibilidade, menos provável neste caso, é que o programa esteja ligado ao disco, ou seja, esteja lendo e gravando no / para o disco que esteja lento e a CPU esteja aguardando o disco.

jmmcd
fonte
5
tente iotoppara monitorar programas vinculados ao iowait
cat
1
Ou o próprio código é síncrono e bloqueador.
Zydnar
Esse foi o meu erro, muito obrigado
Fipsi 25/10