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?

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).


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.