Как узнать количество процессоров с помощью python



Я хочу знать количество процессоров на локальной машине с помощью Python. Результат должен быть user/real Как вывод time(1) при вызове с оптимально масштабируемой программой только для пользовательского пространства.

284   11  

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 может поднять a NotImplementedError пока psutil сможет получить количество процессоров. Это просто потому, что psutil сначала пытается использовать те же методы, используемые multiprocessing и, если те терпят неудачу, то оно также использует другое методы.

В Python 3.4+: оС.cpu_count ().

multiprocessing.cpu_count() реализуется в терминах этой функции, но вызывает NotImplementedError если os.cpu_count() возвращает None ("не удается определить количество процессоров").

независимая платформа:

psutil.cpu_count (logical=False)

https://github.com/giampaolo/psutil/blob/master/INSTALL.rst

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()
import os

print(os.cpu_count())

другой вариант, если у вас нет 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

    Ничего не найдено.