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
multiprocessing
módulo. A multiprocessing.Pool
classe 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 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.