Quiero saber la cantidad de CPU en la máquina local que usa Python. El resultado debe ser user/real
como resultado time(1)
cuando se llama con un programa de espacio de usuario de escala óptima.
python
system-information
phihag
fuente
fuente
/proc/<PID>/status
tiene algunas líneas que le indican la cantidad de CPU en el cpuset actual: busqueCpus_allowed_list
.Respuestas:
Si tiene Python con una versión> = 2.6, simplemente puede usar
http://docs.python.org/library/multiprocessing.html#multiprocessing.cpu_count
fuente
os.cpu_count()
Si está interesado en la cantidad de procesadores disponibles para su proceso actual, primero debe verificar cpuset . De lo contrario (o si cpuset no está en uso), este
multiprocessing.cpu_count()
es el camino a seguir en Python 2.6 y versiones posteriores. El siguiente método recurre a un par de métodos alternativos en versiones anteriores de Python:fuente
/proc/self/status
son respectivamente ff, f y f --- correspondientes a 8, 4 y 4 por tus (correctas) matemáticas. Sin embargo, el número real de CPU es, respectivamente, 4, 2 y 1. Me parece que contar el número de apariciones de la palabra "procesador"/proc/cpuinfo
puede ser la mejor manera de hacerlo. (¿O tengo una pregunta incorrecta?)/proc/cpuinfo
eso que si para cualquiera de los listados de cada "procesador" se multiplican los "hermanos" por los "núcleos de la CPU" obtienes tu número "Cpus_allowed". Y deduzco que los hermanos se refieren al hiperhilo, de ahí su referencia a "virtual". Pero el hecho es que su número "Cpus_allowed" es 8 en mi MacPro, mientras que sumultiprocessing.cpu_count()
respuesta es 4. La míaopen('/proc/cpuinfo').read().count('processor')
también produce 4, el número de núcleos físicos (dos procesadores de doble núcleo).open('/proc/self/status').read()
se olvida de cerrar el archivo. Usar en suwith open('/proc/self/status') as f: f.read()
lugaros.cpu_count()
with
para cuando encuentre un caso donde lo necesite.Otra opción es usar la
psutil
biblioteca, que siempre resulta útil en estas situaciones:Esto debería funcionar en cualquier plataforma compatible con
psutil
(Unix y Windows).Tenga en cuenta que en algunas ocasiones
multiprocessing.cpu_count
puede aumentar unNotImplementedError
tiempopsutil
podrá obtener el número de CPU. Esto es simplemente porquepsutil
primero intenta usar las mismas técnicas que usamultiprocessing
y, si fallan, también usa otras técnicas.fuente
psutil.cpu_count(logical = True)
psutil.cpu_count()
da 12 (es una CPU de 6 núcleos con hyperthreading). Esto se debe a que el argumento predeterminado delogical
es True, por lo que debe escribir explícitamentepsutil.cpu_count(logical = False)
para obtener el número de núcleos físicos.En Python 3.4+: os.cpu_count () .
multiprocessing.cpu_count()
se implementa en términos de esta función, pero aumentaNotImplementedError
sios.cpu_count()
devuelveNone
("no se puede determinar el número de CPU").fuente
cpu_count
.len(os.sched_getaffinity(0))
podría ser mejor, dependiendo del propósito.os.cpu_count()
pregunta OP) puede diferir del número de CPU que están disponibles para el proceso actual (os.sched_getaffinity(0)
).os.sched_getaffinity(0)
está disponible en BSD, por lo que se requiere el uso de (sin otra biblioteca externa, es decir).os.cpu_count()
len(os.sched_getaffinity(0))
es lo que normalmente quiereshttps://docs.python.org/3/library/os.html#os.sched_getaffinity
os.sched_getaffinity(0)
(agregado en Python 3) devuelve el conjunto de CPU disponibles teniendo en cuenta lasched_setaffinity
llamada al sistema Linux , que limita en qué CPU puede ejecutarse un proceso y sus hijos.0
significa obtener el valor para el proceso actual. La función devuelve unaset()
de las CPU permitidas, por lo tanto, la necesidad delen()
.multiprocessing.cpu_count()
Por otro lado, solo devuelve el número total de CPU físicas.La diferencia es especialmente importante porque ciertos sistemas de administración de clúster como Platform LSF limitan el uso de CPU de trabajo
sched_getaffinity
.Por lo tanto, si lo usa
multiprocessing.cpu_count()
, su script podría intentar usar muchos más núcleos de los que tiene disponibles, lo que puede provocar sobrecarga y tiempos de espera.Podemos ver la diferencia concretamente restringiendo la afinidad con la
taskset
utilidad.Por ejemplo, si restrinjo Python a solo 1 núcleo (núcleo 0) en mi sistema de 16 núcleos:
con el script de prueba:
main.py
entonces la salida es:
nproc
sin embargo, respeta la afinidad por defecto y:salidas:
y lo
man nproc
hace bastante explícito:nproc
tiene el--all
indicador para el caso menos común en el que desea obtener el recuento físico de CPU:El único inconveniente de este método es que parece ser solo UNIX. Supuse que Windows debe tener una API de afinidad similar, posiblemente
SetProcessAffinityMask
, así que me pregunto por qué no se ha portado. Pero no sé nada sobre Windows.Probado en Ubuntu 16.04, Python 3.5.2.
fuente
Si desea saber la cantidad de núcleos físicos (no núcleos virtuales hiperprocesados), aquí hay una solución independiente de la plataforma:
https://github.com/giampaolo/psutil/blob/master/INSTALL.rst
Tenga en cuenta que el valor predeterminado para
logical
esTrue
, por lo tanto, si desea incluir núcleos hipertirados, puede usar:Esto dará el mismo número que
os.cpu_count()
ymultiprocessing.cpu_count()
, ninguno de los cuales tiene ellogical
argumento de palabra clave.fuente
psutil.cpu_count(logical=False) #4
psutil.cpu_count(logical=True) #8
ymultiprocessing.cpu_count() #8
Estos le dan el conteo de CPU hiperprocesado
multiprocessing.cpu_count()
os.cpu_count()
Estos le dan el recuento de CPU de la máquina virtual
psutil.cpu_count()
numexpr.detect_number_of_cores()
Solo importa si trabaja en máquinas virtuales.
fuente
os.cpu_count()
ymultiprocessing.cpu_count()
devolverá los recuentos de CPU hiperprocesados, no el recuento de CPU física real.multiprocessing.cpu_count()
devolverá el número de CPU lógicas, por lo que si tiene una CPU de cuatro núcleos con hyperthreading, volverá8
. Si desea la cantidad de CPU físicas, use los enlaces de python para hwloc:hwloc está diseñado para ser portátil en sistemas operativos y arquitecturas.
fuente
psutil.cpu_count(logical=False)
No puedo entender cómo agregar al código o responder al mensaje, pero aquí hay soporte para jython que puede agregar antes de darse por vencido:
fuente
Esto puede funcionar para aquellos de nosotros que usamos diferentes sistemas operativos, pero queremos obtener lo mejor de todos los mundos:
fuente
También puede usar "joblib" para este propósito.
Este método le dará la cantidad de cpus en el sistema. Sin embargo, debe instalarse JobLib. Puede encontrar más información sobre joblib aquí. https://pythonhosted.org/joblib/parallel.html
Alternativamente, puede usar el paquete numexpr de python. Tiene muchas funciones simples útiles para obtener información sobre la CPU del sistema.
fuente
Otra opción si no tienes Python 2.6:
fuente