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.