Uso Python para ejecutar algunos algoritmos y no importa qué Python use, y he probado muchas versiones, el uso de la CPU llega al 25% máximo. ¿Por qué Python no aprovecha el resto de los recursos de mi CPU? Cambié la prioridad del servicio de normal a alta y más tarde a tiempo real, con reinicios intermedios, pero nada cambió.
¿Hay alguna manera de hacer que Python use el 50% o incluso más de mi CPU?
Respuestas:
En pocas palabras, está ejecutando una aplicación de subproceso único en un sistema con 4 núcleos lógicos; como tal, tiene un proceso, utilizando todo el núcleo.
Deberá (y esto no es trivial) necesitar reescribir el algoritmo para que sea multiproceso, o ver si puede ejecutar 2 o más instancias, en núcleos específicos para usar más de su CPU. No hay otra manera.
fuente
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.
multiprocessing
módulo. Lamultiprocessing.Pool
clase proporciona vectorización a través de múltiples CPU con losmap()
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.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.fuente