11 ответов:
Если у вас есть python с версией >= 2.6, вы можете просто использовать
import multiprocessing multiprocessing.cpu_count()http://docs.python.org/library/multiprocessing.html#multiprocessing.cpu_count
Если вас интересует количество процессоров скачать для вашего текущего процесса, вы должны проверить наборе процессоров первый. В противном случае (или если cpuset не используется),
multiprocessing.cpu_count()это путь в Python 2.6 и новее. Следующий метод возвращается к нескольким альтернативным методам в более старых версиях 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')
другой вариант-использовать
psutilбиблиотека, которая всегда оказывается полезной в таких ситуациях:>>> import psutil >>> psutil.cpu_count() 2это должно работать на любой платформе, поддерживаемой
psutil(Unix и Windows).обратите внимание, что в некоторых случаях
multiprocessing.cpu_countможет поднять aNotImplementedErrorпокаpsutilсможет получить количество процессоров. Это просто потому, чтоpsutilсначала пытается использовать те же методы, используемыеmultiprocessingи, если те терпят неудачу, то оно также использует другое методы.
В Python 3.4+: оС.cpu_count ().
multiprocessing.cpu_count()реализуется в терминах этой функции, но вызываетNotImplementedErrorеслиos.cpu_count()возвращаетNone("не удается определить количество процессоров").
multiprocessing.cpu_count()вернет количество логических процессоров, так что если у вас есть четырехъядерный процессор с hyperthreading, он вернет8. Если вам нужно количество физических процессоров, используйте привязки python к hwloc:#!/usr/bin/env python import hwloc topology = hwloc.Topology() topology.load() print topology.get_nbobjs_by_type(hwloc.OBJ_CORE)hwloc предназначен для переноски через ОС и архитектуры.
Не могу понять, как добавить в код или ответить на сообщение, но вот поддержка jython, которую вы можете добавить, прежде чем сдаться:
# jython try: from java.lang import Runtime runtime = Runtime.getRuntime() res = runtime.availableProcessors() if res > 0: return res except ImportError: pass
вы также можете использовать "joblib" для этой цели.
import joblib print joblib.cpu_count()этот метод даст вам количество процессоров в системе. joblib должен быть установлен. Более подробную информацию о joblib можно найти здесь https://pythonhosted.org/joblib/parallel.html
в качестве альтернативы вы можете использовать пакет numexpr python. Он имеет много простых функций, полезных для получения информации о системном процессоре.
import numexpr as ne print ne.detect_number_of_cores()
другой вариант, если у вас нет Python 2.6:
import commands n = commands.getoutput("grep -c processor /proc/cpuinfo")
это функция cpu_count от multiprocessing
:}
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')
Comments