Como aumentar o uso da CPU do Python

15

Eu uso o Python para executar alguns algoritmos e não importa qual Python eu uso, e eu tentei muitas versões, o uso da CPU vai para 25% no máximo. Por que o Python não tira proveito do restante dos recursos da minha CPU? Mudei a prioridade do serviço de normal para alta e depois para tempo real, com reinícios no meio, mas nada mudou.

Existe uma maneira de fazer o Python usar 50% ou mais da minha CPU?

    
por Christos K. 23.11.2013 / 10:46

2 respostas

14

Simplesmente, você está executando um único aplicativo encadeado em um sistema com 4 núcleos lógicos - assim, você tem um processo, usando todo o núcleo.

Você (e isso não é trivial) precisa reescrever o algoritmo para ser multi-threaded, ou veja se você pode apenas executar 2 ou mais instâncias, em núcleos específicos para usar mais da sua CPU. Não há outro jeito.

    
por 23.11.2013 / 10:54
11

A linguagem Python é anterior às CPUs multi-core, por isso não é estranho que não as use nativamente.

Além disso, nem todos os programas podem lucrar com vários núcleos. Um cálculo feito em etapas, em que a próxima etapa depende dos resultados da etapa anterior, não será mais rápido usando mais núcleos. Problemas que podem ser vetorizados (aplicando o mesmo cálculo a grandes conjuntos de dados) podem ser relativamente fáceis de usar múltiplos núcleos porque os cálculos individuais são independentes.

Quando você está fazendo muitos cálculos, presumo que esteja usando numpy ? Se não, confira! É uma extensão escrita em C que pode usar bibliotecas de álgebra lineares otimizadas como o ATLAS. Ele pode acelerar cálculos numéricos significativamente em comparação com o padrão python.

Dito isto, existem várias maneiras de usar vários núcleos com python.

  • Incorporado é o módulo multiprocessing . A classe multiprocessing.Pool fornece vetorização em várias CPUs com os métodos map() e relacionados. Há um trade-off aqui, no entanto. Se você precisar comunicar grandes quantidades de dados entre os processos, essa sobrecarga poderá negar a vantagem de vários núcleos.
  • Use uma compilação adequada de numpy. Se numpy é construído com uma biblioteca ATLAS multithreading, será mais rápido em grandes problemas.
  • Use módulos de extensão como numexpr , python paralelo , corepy ou Copenhague Código de bytes vetoriais .

Observe que o módulo threading não é tão útil quanto a isso. Para manter o gerenciamento de memória simples, o bloqueio global de intérprete ("GIL") impõe que apenas um thread por vez pode estar executando o bytecode python. Módulos externos como o numpy podem usar vários encadeamentos internamente.

    
por 23.11.2013 / 11:43