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?
Respostas:
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.
fonte
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.
multiprocessing
módulo. Amultiprocessing.Pool
classe fornece vetorização em várias CPUs com osmap()
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.Observe que o
threading
mó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.fonte