getsizeof - Cómo averiguar el número de CPU que utilizan Python
sys stdout python 3 (11)
Quiero saber la cantidad de CPU en la máquina local que utiliza Python. El resultado debe ser user/real
como resultado por time(1)
cuando se llama con un programa de solo espacio de usuario de escalamiento óptimo.
Esta es la función cpu_count de multiprocesamiento
:}
import os
import sys
def cpu_count():
''''''
Returns the number of CPUs in the system
''''''
if sys.platform == ''win32'':
try:
num = int(os.environ[''NUMBER_OF_PROCESSORS''])
except (ValueError, KeyError):
num = 0
elif ''bsd'' in sys.platform or sys.platform == ''darwin'':
comm = ''/sbin/sysctl -n hw.ncpu''
if sys.platform == ''darwin'':
comm = ''/usr'' + comm
try:
with os.popen(comm) as p:
num = int(p.read())
except ValueError:
num = 0
else:
try:
num = os.sysconf(''SC_NPROCESSORS_ONLN'')
except (ValueError, OSError, AttributeError):
num = 0
if num >= 1:
return num
else:
raise NotImplementedError(''cannot determine number of cpus'')
En Python 3.4+: os.cpu_count() .
multiprocessing.cpu_count()
se implementa en términos de esta función, pero genera NotImplementedError
si os.cpu_count()
devuelve None
("no se puede determinar el número de CPUs").
No puedo averiguar cómo agregar al código o responder al mensaje, pero aquí hay soporte para jython que puede agregar antes de darse por vencido:
# jython
try:
from java.lang import Runtime
runtime = Runtime.getRuntime()
res = runtime.availableProcessors()
if res > 0:
return res
except ImportError:
pass
Otra opción es usar la biblioteca psutil
, que siempre resulta útil en estas situaciones:
>>> import psutil
>>> psutil.cpu_count()
2
Esto debería funcionar en cualquier plataforma soportada por psutil
(Unix y Windows).
Tenga en cuenta que en algunas ocasiones multiprocessing.cpu_count
puede generar un NotImplementedError
mientras que psutil
podrá obtener el número de CPU. Esto es simplemente porque psutil
primero intenta usar las mismas técnicas que se utilizan en el multiprocessing
y, si fallan, también usa otras técnicas.
Otra opción si no tienes Python 2.6:
import commands
n = commands.getoutput("grep -c processor /proc/cpuinfo")
Si está interesado en la cantidad de procesadores disponibles para su proceso actual, primero cpuset verificar cpuset . De lo contrario (o si cpuset no está en uso), http://docs.python.org/library/multiprocessing.html#multiprocessing.cpu_count es el camino a seguir en Python 2.6 y más reciente. El siguiente método recurre a un par de métodos alternativos en versiones anteriores de Python:
import os
import re
import subprocess
def available_cpu_count():
""" Number of available virtual or physical CPUs on this system, i.e.
user/real as output by time(1) when called with an optimally scaling
userspace-only program"""
# cpuset
# cpuset may restrict the number of *available* processors
try:
m = re.search(r''(?m)^Cpus_allowed:/s*(.*)$'',
open(''/proc/self/status'').read())
if m:
res = bin(int(m.group(1).replace('','', ''''), 16)).count(''1'')
if res > 0:
return res
except IOError:
pass
# Python 2.6+
try:
import multiprocessing
return multiprocessing.cpu_count()
except (ImportError, NotImplementedError):
pass
# https://github.com/giampaolo/psutil
try:
import psutil
return psutil.cpu_count() # psutil.NUM_CPUS on old versions
except (ImportError, AttributeError):
pass
# POSIX
try:
res = int(os.sysconf(''SC_NPROCESSORS_ONLN''))
if res > 0:
return res
except (AttributeError, ValueError):
pass
# Windows
try:
res = int(os.environ[''NUMBER_OF_PROCESSORS''])
if res > 0:
return res
except (KeyError, ValueError):
pass
# jython
try:
from java.lang import Runtime
runtime = Runtime.getRuntime()
res = runtime.availableProcessors()
if res > 0:
return res
except ImportError:
pass
# BSD
try:
sysctl = subprocess.Popen([''sysctl'', ''-n'', ''hw.ncpu''],
stdout=subprocess.PIPE)
scStdout = sysctl.communicate()[0]
res = int(scStdout)
if res > 0:
return res
except (OSError, ValueError):
pass
# Linux
try:
res = open(''/proc/cpuinfo'').read().count(''processor/t:'')
if res > 0:
return res
except IOError:
pass
# Solaris
try:
pseudoDevices = os.listdir(''/devices/pseudo/'')
res = 0
for pd in pseudoDevices:
if re.match(r''^cpuid@[0-9]+$'', pd):
res += 1
if res > 0:
return res
except OSError:
pass
# Other UNIXes (heuristic)
try:
try:
dmesg = open(''/var/run/dmesg.boot'').read()
except IOError:
dmesgProcess = subprocess.Popen([''dmesg''], stdout=subprocess.PIPE)
dmesg = dmesgProcess.communicate()[0]
res = 0
while ''/ncpu'' + str(res) + '':'' in dmesg:
res += 1
if res > 0:
return res
except OSError:
pass
raise Exception(''Can not determine number of CPUs on this system'')
Si tiene python con una versión> = 2.6, simplemente puede usar
import multiprocessing
multiprocessing.cpu_count()
http://docs.python.org/library/multiprocessing.html#multiprocessing.cpu_count
También puede utilizar "joblib" para este propósito.
import joblib
print joblib.cpu_count()
Este método le dará el número de CPU en el sistema. Joblib necesita ser instalado sin embargo. Puede encontrar más información sobre joblib aquí https://pythonhosted.org/joblib/parallel.html
Alternativamente, puede utilizar el paquete numexpr de python. Tiene muchas funciones simples útiles para obtener información sobre la CPU del sistema.
import numexpr as ne
print ne.detect_number_of_cores()
plataforma independiente:
psutil.cpu_count (lógico = Falso)
multiprocessing.cpu_count()
devolverá el número de CPU lógicas, por lo que si tiene una CPU de cuatro núcleos con hyperthreading, devolverá 8
. Si desea el número de CPU físicas, use los enlaces de python para hwloc:
#!/usr/bin/env python
import hwloc
topology = hwloc.Topology()
topology.load()
print topology.get_nbobjs_by_type(hwloc.OBJ_CORE)
hwloc está diseñado para ser portátil a través de sistemas operativos y arquitecturas.
import os
print(os.cpu_count())