Я хочу знать количество процессоров на локальной машине, использующих Python. Результат должен user/real
выводиться time(1)
при вызове с помощью оптимально масштабируемой программы только для пространства пользователя.
python
system-information
phihag
источник
источник
/proc/<PID>/status
есть несколько строк, которые сообщают вам количество процессоров в текущем процессоре: ищитеCpus_allowed_list
.Ответы:
Если у вас есть Python с версией> = 2.6, вы можете просто использовать
http://docs.python.org/library/multiprocessing.html#multiprocessing.cpu_count
источник
os.cpu_count()
Если вас интересует количество процессоров, доступных вашему текущему процессу, вам сначала нужно проверить cpuset . В противном случае (или если cpuset не используется),
multiprocessing.cpu_count()
это путь в Python 2.6 и новее. Следующий метод использует пару альтернативных методов в старых версиях Python:источник
/proc/self/status
равны соответственно ff, f и f ---, что соответствует 8, 4 и 4 по вашей (правильной) математике. Однако фактическое количество процессоров составляет соответственно 4, 2 и 1. Я считаю, что подсчет числа появлений слова «процессор»/proc/cpuinfo
может быть лучшим способом. (Или у меня неправильный вопрос?)/proc/cpuinfo
что если для любого из списков для каждого "процессора" вы умножаете "братьев и сестер" на "ядра процессора" Вы получите свой номер "Cpus_allowed". И я понимаю, что братья и сестры относятся к гиперпоточности, отсюда ваша ссылка на «виртуальную». Но факт остается фактом: ваше число «Cpus_allowed» равно 8 на моем MacPro, а вашmultiprocessing.cpu_count()
ответ - 4. Мой собственныйopen('/proc/cpuinfo').read().count('processor')
также выдает 4, количество физических ядер (два двухъядерных процессора).open('/proc/self/status').read()
забывает закрыть файл. Используйтеwith open('/proc/self/status') as f: f.read()
вместо этогоos.cpu_count()
with
когда вы сталкиваетесь со случаем, когда вам это нужно.Другой вариант - использовать
psutil
библиотеку, которая всегда оказывается полезной в следующих ситуациях:Это должно работать на любой поддерживаемой платформе
psutil
(Unix и Windows).Обратите внимание, что в некоторых случаях
multiprocessing.cpu_count
может поднять некотороеNotImplementedError
времяpsutil
будет возможность получить количество процессоров. Это просто потому, чтоpsutil
сначала пытается использовать те же методы, которые используются,multiprocessing
и, если они терпят неудачу, он также использует другие методы.источник
psutil.cpu_count(logical = True)
psutil.cpu_count()
выдает 12 (это 6-ядерный процессор с гиперпоточностью). Это связано с тем, что аргумент по умолчаниюlogical
- True, поэтому вам явно нужно написать,psutil.cpu_count(logical = False)
чтобы получить количество физических ядер.В Python 3.4+: os.cpu_count () .
multiprocessing.cpu_count()
реализован в терминах этой функции, но повышается,NotImplementedError
еслиos.cpu_count()
возвращаетNone
(«не может определить количество процессоров»).источник
cpu_count
.len(os.sched_getaffinity(0))
может быть лучше, в зависимости от цели.os.cpu_count()
что запрашивает OP) может отличаться от количества процессоров, доступных текущему процессу (os.sched_getaffinity(0)
).os.sched_getaffinity(0)
это не доступно на BSD, поэтому использованиеos.cpu_count()
не требуется (без других внешних библиотек, то есть).len(os.sched_getaffinity(0))
это то, что вы обычно хотитеhttps://docs.python.org/3/library/os.html#os.sched_getaffinity
os.sched_getaffinity(0)
(добавлено в Python 3) возвращает набор доступных процессоров с учетомsched_setaffinity
системного вызова Linux , который ограничивает, на каких процессорах процесс и его дочерние элементы могут работать.0
означает получить значение для текущего процесса. Функция возвращаетset()
разрешенные ЦП, таким образом, необходимостьlen()
.multiprocessing.cpu_count()
с другой стороны, просто возвращает общее количество физических процессоров.Разница особенно важна, потому что некоторые системы управления кластером, такие как Platform LSF, ограничивают использование ЦП заданием
sched_getaffinity
.Поэтому, если вы используете
multiprocessing.cpu_count()
, ваш скрипт может попытаться использовать больше ядер, чем у него есть, что может привести к перегрузке и тайм-аутам.Мы можем увидеть разницу конкретно, ограничив сродство с
taskset
утилитой.Например, если я ограничу Python только одним ядром (ядро 0) в моей 16-ядерной системе:
с тестовым скриптом:
main.py
тогда вывод:
nproc
однако по умолчанию соблюдает сходство и:выходы:
и
man nproc
делает это довольно явным:nproc
имеет--all
флаг для менее распространенного случая, когда вы хотите получить физический счетчик ЦП:Единственным недостатком этого метода является то, что это только UNIX. Я предположил, что Windows должен иметь похожий API-интерфейс, возможно
SetProcessAffinityMask
, поэтому я удивляюсь, почему он не был портирован. Но я ничего не знаю о Windows.Протестировано в Ubuntu 16.04, Python 3.5.2.
источник
Если вы хотите узнать количество физических ядер (не виртуальных гиперпоточных ядер), вот решение, не зависящее от платформы:
https://github.com/giampaolo/psutil/blob/master/INSTALL.rst
Обратите внимание, что значением по умолчанию
logical
являетсяTrue
, поэтому, если вы хотите включить многопоточные ядра, вы можете использовать:Это даст тот же номер, что
os.cpu_count()
иmultiprocessing.cpu_count()
, и ни один из которых не имеетlogical
ключевое слово аргумент.источник
psutil.cpu_count(logical=False) #4
psutil.cpu_count(logical=True) #8
иmultiprocessing.cpu_count() #8
Они дают вам подсчитанное количество процессоров
multiprocessing.cpu_count()
os.cpu_count()
Они дают вам количество ЦП виртуальной машины
psutil.cpu_count()
numexpr.detect_number_of_cores()
Имеет значение только если вы работаете на виртуальных машинах.
источник
os.cpu_count()
иmultiprocessing.cpu_count()
будет возвращать количество многопоточных процессоров, а не фактическое количество физических процессоров.multiprocessing.cpu_count()
вернет количество логических процессоров, поэтому если у вас есть четырехъядерный процессор с гиперпоточностью, он вернется8
. Если вы хотите количество физических процессоров, используйте привязки python к hwloc:hwloc предназначен для переноса между операционными системами и архитектурами.
источник
psutil.cpu_count(logical=False)
Не могу понять, как добавить код или ответить на сообщение, но вот поддержка jython, которую вы можете использовать перед тем, как сдаться:
источник
Это может работать для тех из нас, кто использует разные ОС / системы, но хочет получить лучшее из всех миров:
источник
Вы также можете использовать "joblib" для этой цели.
Этот метод даст вам количество процессоров в системе. joblib должен быть установлен, хотя. Более подробную информацию о joblib можно найти здесь https://pythonhosted.org/joblib/parallel.html
В качестве альтернативы вы можете использовать Numberxpr пакет Python. Он имеет много простых функций, полезных для получения информации о системном процессоре.
источник
Другой вариант, если у вас нет Python 2.6:
источник