Вопрос по python, system-information – Как узнать количество процессоров использующих python

397

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

Вы должны помнить о cpusets (в Linux). Если вы используете процессор, приведенные ниже решения по-прежнему будут указывать количество реальных процессоров в системе, а не число, доступное для вашего процесса./proc/<PID>/status имеет несколько строк, которые сообщают вам количество процессоров в текущем процессоре: ищитеCpus_allowed_list. wpoely86

Ваш Ответ

12   ответов
0

Поскольку я пока не могу комментировать:

Это дает вам «физическое» Количество процессоров

  1. multiprocessing.cpu_count()
  2. os.cpu_count()

Они дают вам количество ЦП виртуальной машины

  1. psutil.cpu_count()
  2. numexpr.detect_number_of_cores()

Имеет значение только если вы работаете на виртуальных машинах.

157

Если вы заинтересованы в количестве процессоровavailable чтобы ваш текущий процесс, вы должны проверить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'^[email protected][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')
os.cpu_count()
@EOL Да, конечно. Выглядит как замена с ума сошла. Исправленный. phihag
open('/proc/self/status').read() забывает закрыть файл. использованиеwith open('/proc/self/status') as f: f.read() вместо
Я предполагаю, что вы имеете в виду subprocess.PIPE, а не Popen.PIPE, верно?
@amcgregor В этом случае это приемлемо, согласованно, просто оставить дескрипторы файлов открытыми, что, я думаю, нормально, если вы не пишете долго работающий демон / процесс; который, я боюсь, может в конечном итоге попасть в дескрипторы макс открытого файла ОС. Это хуже при записи в файл, который необходимо снова прочитать до завершения процесса, но это не тот случай, так что это спорный вопрос. Все еще хорошая идея иметь привычку использоватьwith потому что, когда вы сталкиваетесь со случаем, когда вам это нужно.
25
import os

print(os.cpu_count())
Недоступно для Python 2 (только для Python 3)
1

This is the function cpu_count from 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')
0

Другой вариант, если у вас нет Python 2.6:

import commands
n = commands.getoutput("grep -c processor /proc/cpuinfo")
Спасибо! Это доступно только в Linux, и уже включеноin my answer. phihag
4

Вы также можете использовать & quot; joblib & quot; для этого.

import joblib
print joblib.cpu_count()

Этот метод даст вам количество процессоров в системе. joblib должен быть установлен, хотя. Более подробную информацию о joblib можно найти здесьhttps://pythonhosted.org/joblib/parallel.html

В качестве альтернативы вы можете использовать Numberxpr пакет Python. Он имеет много простых функций, полезных для получения информации о системном процессоре.

import numexpr as ne
print ne.detect_number_of_cores()
joblib использует базовый многопроцессорный модуль. Вероятно, для этого лучше всего обратиться к мультипроцессору.
25

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

psutil.cpu_count(logical=False)

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

В чем разница между логическим процессором и не логическим? на моем ноутбуке:psutil.cpu_count(logical=False) #4 psutil.cpu_count(logical=True) #8 а такжеmultiprocessing.cpu_count() #8
логическим является «смоделированный процессор»:en.wikipedia.org/wiki/Hyper-threading
@ user305883 при условии, что у вас процессор x86, у вас естьhyperthreading на этой машине, то есть каждое физическое ядро соответствует двум гиперпотокам («логическим» ядрам). Гиперпоточность позволяет использовать физическое ядро для выполнения инструкций из потока B, когда его части простаивают для потока A (например, ожидая получения данных из кэша или памяти). В зависимости от вашего кода можно получить один или несколько десятков процентов дополнительного использования ядра, но это намного ниже производительности реального физического ядра.
33

В Python 3.4+:os.cpu_count ().

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

Смотрите также документациюcpu_count. len(os.sched_getaffinity(0)) может быть лучше, в зависимости от цели.
Я знаю. Я просто хотел добавить это для других читателей, которые могут упустить эту разницу, чтобы получить от них более полную картину.
@ Альберт да, количество процессоров в системе (os.cpu_count()& # x2014; что запрашивает OP) может отличаться от количества процессоров, доступных для текущего процесса (os.sched_getaffinity(0)).
692

Если у вас есть Python с версией & gt; = 2.6, вы можете просто использовать

import multiprocessing

multiprocessing.cpu_count()

http://docs.python.org/library/multiprocessing.html#multiprocessing.cpu_count

@Casey Да, это так, используя sysctl -n. phihag
Это дает количество доступных процессоров ... не используемых программой!
На Python 3.6.2 я мог использовать толькоos.cpu_count()
многопроцессорность также поддерживается в 3.x
Я хочу добавить, что это не работает в IronPython, который вызывает ошибку NotImplementedError.
15

multiprocessing.cpu_count() вернет количество логических процессоров, поэтому, если у вас есть четырехъядерный процессор с гиперпоточностью, он вернет8, Если вы хотите количество физических процессоров, используйте привязки python к hwloc:

#!/usr/bin/env python
import hwloc
topology = hwloc.Topology()
topology.load()
print topology.get_nbobjs_by_type(hwloc.OBJ_CORE)

hwloc предназначен для переноса между операционными системами и архитектурами.

В этом случае мне нужно количество логических процессоров (т. Е. Сколько потоков следует запустить, если эта программа действительно хорошо масштабируется), но, тем не менее, ответ может оказаться полезным. phihag
или жеpsutil.cpu_count(logical=False)
7

Не могу понять, как добавить код или ответить на сообщение, но здесь есть поддержка jython, которую вы можете использовать перед тем, как сдаться:

# jython
try:
    from java.lang import Runtime
    runtime = Runtime.getRuntime()
    res = runtime.availableProcessors()
    if res > 0:
        return res
except ImportError:
    pass
69

Другой вариант заключается в использованииpsutil библиотека, которая всегда оказывается полезной в следующих ситуациях:

>>> import psutil
>>> psutil.cpu_count()
2

Это должно работать на любой платформе, поддерживаемойpsutil(Unix и Windows).

Обратите внимание, что в некоторых случаяхmultiprocessing.cpu_count может поднятьNotImplementedError в то время какpsutil сможет получить количество процессоров. Это просто потому чтоpsutil сначала пытается использовать те же методы, используемыеmultiprocessing и, если они терпят неудачу, он также использует другие методы.

Похожие вопросы