Cómo aumentar el uso de CPU de Python

21

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?

Christos K.
fuente
¿Es tu CPU una CPU multinúcleo?
Journeyman Geek
sí, es un i5-480M y en el panel de control> opciones de energía> cpu min / max está al 100%
Christos K.

Respuestas:

20

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.

Journeyman Geek
fuente
Tenía miedo de que este fuera el caso, pero en los diagramas de uso de la CPU en el administrador de tareas de Windows no veo que 1 diagrama esté seleccionado mientras se ejecuta el algoritmo, por el contrario, los veo a todos con un aumento significativo.
Christos K.
1
Su sistema está equilibrando la carga entre núcleos. Aún así, no se utilizan dos núcleos a la vez.
gronostaj
chicos, confirmaron mis miedos, parece que ya es hora de que empiece a leer sobre hilos
Christos K.
@ fractal_7: Enhebrar podría no traer los beneficios que espera. Vea mi respuesta a continuación.
Roland Smith el
15

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 multiprocessingmódulo. La multiprocessing.Poolclase 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 threadingmó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.

Roland Smith
fuente
Hasta ahora he usado python 2.7 ironpython y probé pypy. Le daré una oportunidad a Numpy. pero aún así tendré que leer antes de poder usar cualquier módulo de multiprocesamiento.
Christos K.