Python Interpreter solo usa 12% de potencia de CPU

26

Estoy usando python en ubuntu para el análisis de texto. A pesar de la gran cantidad de trabajo que realiza el programa, el uso de la CPU, como se muestra en el monitor del sistema, se mantiene constante en 12%.

Cambié la prioridad del programa de Normala Very Highpero eso no tuvo ningún efecto.

¿Qué limita la cantidad de uso de CPU que puede obtener mi programa Python y cómo puedo cambiar eso, para que el programa pueda utilizar más potencia de la CPU?

Matthias Herrmann
fuente

Respuestas:

73

¿Supongo que tiene una CPU con 8 núcleos virtuales (probablemente de cuatro núcleos con hiperprocesamiento)? Eso significa que un subproceso de CPU / núcleo virtual completamente cargado equivale a una carga total del 12,5%.

El intérprete de Python es una aplicación que solo se ejecuta como un único proceso de forma predeterminada y, por lo tanto, no puede aprovechar más de un núcleo virtual. Incluso si el código que ejecuta con él utiliza subprocesos múltiples, seguirá utilizando solo un subproceso de CPU / núcleo virtual, debido al GIL (bloqueo global del intérprete) .

Solo si su programa Python usa multiprocesamiento , que de hecho inicia múltiples instancias del intérprete de Python y les permite realizar sus tareas realmente paralelas, puede aprovechar múltiples núcleos virtuales / hilos de CPU. (Como @SargeBorsch señaló en su comentario, también hay algunas formas avanzadas de lograr esto sin multiprocesamiento, pero eso normalmente no es algo que usted mismo escriba rápidamente).

Byte Commander
fuente
De hecho, eso tiene mucho sentido. Sí, estoy teniendo un quad-core con 4 núcleos (8 núcleos virtuales). Ty
Matthias Herrmann
99
@MatthiasHerrmann Podría considerar un monitor del sistema que le muestre en qué porcentaje está funcionando cada CPU. De esa manera, solo se podían ver 1 de 8 CPUs al 100%. Aquí hay un hilo en AU sobre el tema: ¿ Windows "gadgets" equivalente (para uso de wifi y cpu)?
WinEunuuchs2Unix
77
No es cierto, es posible usar todos los núcleos del proceso de Python solo bien. Uno solo necesita llamar al código C y liberar el GIL. Y muchas bibliotecas existentes hacen exactamente eso (numpy por ejemplo).
Sarge Borsch
2
O use Jythono IronPython, que no tiene un GIL.
Deja de dañar a Monica el
19

Otra posibilidad, menos probable en este caso, es que el programa esté vinculado al disco, es decir, está leyendo y escribiendo en / desde el disco, lo que es lento, y la CPU está esperando el disco.

jmmcd
fuente
55
intente iotopmonitorear programas vinculados a iowait
cat
1
O el código en sí es sincrónico y bloqueante.
Zydnar
Ese fue mi error, muchas gracias
Fipsi