El lenguaje Python es anterior a las CPU multinúcleo, por lo que no es extraño que no las use de forma nativa.
Además, no todos los programas pueden beneficiarse de múltiples núcleos. Un cálculo realizado en pasos, donde el siguiente paso depende de los resultados del paso anterior, no será más rápido usando más núcleos. Los problemas que pueden ser vectorizados (aplicando el mismo cálculo a grandes conjuntos de datos) pueden hacerse relativamente fáciles de usar múltiples núcleos porque los cálculos individuales son independientes.
Cuando estás haciendo muchos cálculos, ¿supongo que estás usando numpy ? Si no es así, échale un vistazo. Es una extensión escrita en C que puede usar bibliotecas de álgebra lineal optimizadas como ATLAS. Puede acelerar los cálculos numéricos significativamente en comparación con Python estándar.
Dicho esto, hay varias formas de usar múltiples núcleos con Python.
- Incorporado es el
multiprocessing
módulo. La multiprocessing.Pool
clase proporciona vectorización a través de múltiples CPU con los map()
métodos y relacionados. Sin embargo, hay una compensación aquí. Si tiene que comunicar grandes cantidades de datos entre los procesos, esa sobrecarga puede negar la ventaja de múltiples núcleos.
- Use una construcción adecuada de numpy. Si numpy se construye con una biblioteca ATLAS de subprocesos múltiples, será más rápido en problemas grandes.
- Utilice módulos de extensión como numexpr , python paralelo , corepy o Copenhagen Vector Byte Code .
Tenga en cuenta que el threading
módulo no es tan útil a este respecto. Para simplificar la administración de la memoria, el bloqueo global del intérprete ("GIL") exige que solo un subproceso a la vez pueda ejecutar el código de bytes de Python. Sin embargo, los módulos externos como numpy pueden usar múltiples hilos internamente.