Como aumentar o uso da CPU do Python

21

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

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

Christos K.
fonte
seu processador é um processador multicore?
Journeyman Geek
sim, é um i5-480M e no painel de controle> Opções de energia> cpu min / max é a 100%
Christos K.

Respostas:

20

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

Você (e isso não é trivial) precisará reescrever o algoritmo para ser multiencadeado ou verificar se é possível executar apenas 2 ou mais instâncias, em núcleos específicos, para usar mais sua CPU. Não há outra maneira.

Journeyman Geek
fonte
Eu estava com medo de que esse fosse o caso, mas nos diagramas de uso da CPU no gerenciador de tarefas do Windows não vejo um diagrama na seleção enquanto o algoritmo é executado, pelo contrário, vejo todos eles com algum aumento significativo.
Christos K.
11
Seu sistema está equilibrando a carga entre os núcleos. Ainda, dois núcleos não são usados ​​ao mesmo tempo.
gronostaj
caras que você confirmou os meus medos, parece que é hora de eu começar a ler sobre rosqueamento
Christos K.
@ fractal_7: A segmentação pode não trazer os benefícios que você espera. Veja minha resposta abaixo.
Roland Smith
15

A linguagem Python é anterior às CPUs com vários núcleos, por isso não é estranho que não as use nativamente.

Além disso, nem todos os programas podem se beneficiar de vários núcleos. Um cálculo feito nas etapas, onde 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 matrizes 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, suponho que você esteja usando numpy ? Se não, confira! É uma extensão escrita em C que pode usar bibliotecas de álgebra linear otimizadas como ATLAS. Ele pode acelerar os cálculos numéricos significativamente em comparação com o Python padrão.

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

  • Incorporado é o multiprocessingmódulo. A multiprocessing.Poolclasse fornece vetorização em várias CPUs com os map()métodos relacionados. Há uma troca 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 o numpy for criado com uma biblioteca ATLAS multithreading, será mais rápido em problemas grandes.
  • Use módulos de extensão como numexpr , python paralelo , corepy ou Copenhagen Vector Byte Code .

Observe que o threadingmódulo não é tão útil nesse sentido. Para manter o gerenciamento de memória simples, o bloqueio global de intérpretes ("GIL") impõe que apenas um encadeamento por vez possa executar o bytecode python. Porém, módulos externos como numpy podem usar vários threads internamente.

Roland Smith
fonte
Até agora eu usei python 2.7 ironpython e tentei pypy. eu vou dar uma chance a numpy. mas ainda terei que ler antes de poder usar qualquer módulo de multiprocessamento.
precisa