我想知道使用Python的本地计算机上的CPU数量。 当使用最佳缩放的仅用户空间程序调用时,结果应该是user/realtime(1)所输出。


#1楼

如果您对当前进程可用的处理器数量感兴趣,则必须首先检查cpuset 。 否则(或者如果未使用cpuset), multiprocessing.cpu_count()是在Python 2.6及更高版本中使用的方法。 以下方法可回溯到旧版本的Python中的两个替代方法:

import os
import re
import subprocessdef 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 scalinguserspace-only program"""# cpuset# cpuset may restrict the number of *available* processorstry: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 resexcept IOError:pass# Python 2.6+try:import multiprocessingreturn multiprocessing.cpu_count()except (ImportError, NotImplementedError):pass# https://github.com/giampaolo/psutiltry:import psutilreturn psutil.cpu_count()   # psutil.NUM_CPUS on old versionsexcept (ImportError, AttributeError):pass# POSIXtry:res = int(os.sysconf('SC_NPROCESSORS_ONLN'))if res > 0:return resexcept (AttributeError, ValueError):pass# Windowstry:res = int(os.environ['NUMBER_OF_PROCESSORS'])if res > 0:return resexcept (KeyError, ValueError):pass# jythontry:from java.lang import Runtimeruntime = Runtime.getRuntime()res = runtime.availableProcessors()if res > 0:return resexcept ImportError:pass# BSDtry:sysctl = subprocess.Popen(['sysctl', '-n', 'hw.ncpu'],stdout=subprocess.PIPE)scStdout = sysctl.communicate()[0]res = int(scStdout)if res > 0:return resexcept (OSError, ValueError):pass# Linuxtry:res = open('/proc/cpuinfo').read().count('processor\t:')if res > 0:return resexcept IOError:pass# Solaristry:pseudoDevices = os.listdir('/devices/pseudo/')res = 0for pd in pseudoDevices:if re.match(r'^cpuid@[0-9]+$', pd):res += 1if res > 0:return resexcept 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 = 0while '\ncpu' + str(res) + ':' in dmesg:res += 1if res > 0:return resexcept OSError:passraise Exception('Can not determine number of CPUs on this system')

#2楼

如果您的Python版本> = 2.6,则可以简单地使用

import multiprocessingmultiprocessing.cpu_count()

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


#3楼

另一个选择是使用psutil库,该库在以下情况下总是有用的:

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

这应该可以在psutil支持的任何平台(Unix和Windows)上运行。

请注意,在某些情况下, multiprocessing.cpu_count可能会引发NotImplementedErrorpsutil将能够获得CPU数量。 这仅仅是因为psutil首先尝试使用multiprocessing使用的相同技术,如果失败,它还将使用其他技术。


#4楼

multiprocessing.cpu_count()将返回逻辑CPU的数量,因此,如果您具有带超线程功能的四核CPU,它将返回8 。 如果您想要物理CPU的数量,请使用python绑定来hwloc:

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

hwloc设计为可跨操作系统和体系结构移植。


#5楼

如果您没有Python 2.6,请选择另一个选项:

import commands
n = commands.getoutput("grep -c processor /proc/cpuinfo")

#6楼

在Python 3.4+中: os.cpu_count() 。

multiprocessing.cpu_count()是根据此函数实现的,但如果os.cpu_count()返回None (“无法确定CPU数” os.cpu_count()则会引发NotImplementedError


#7楼

您也可以为此目的使用“ joblib”。

import joblib
print joblib.cpu_count()

此方法将为您提供系统中的cpus数。 但是需要安装joblib。 关于joblib的更多信息可以在这里找到https://pythonhosted.org/joblib/parallel.html

或者,您可以使用python的numexpr软件包。 它具有许多简单的功能,有助于获取有关系统cpu的信息。

import numexpr as ne
print ne.detect_number_of_cores()

#8楼

平台无关:

psutil.cpu_count(逻辑=假)

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


#9楼

无法弄清楚如何添加到代码或回复消息,但是这里提供了对jython的支持,您可以在放弃之前先加以支持:

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

#10楼

import osprint(os.cpu_count())

#11楼

这些给你超线程的CPU数量

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

这些为您提供虚拟机的CPU数量

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

仅在您在VM上工作时才重要。


#12楼

len(os.sched_getaffinity(0))是您通常想要的

https://docs.python.org/3/library/os.html#os.sched_getaffinity

考虑到sched_setaffinity Linux系统调用 , os.sched_getaffinity(0) (在Python 3中添加)返回可用的CPU集,它限制了进程及其子进程可以在哪些CPU上运行。

0表示获取当前进程的值。 该函数返回允许的CPU的set() ,因此需要len()

另一方面, multiprocessing.cpu_count()仅返回物理CPU的总数。

区别尤其重要,因为某些集群管理系统(例如Platform LSF)通过sched_getaffinity限制作业CPU使用率。

因此,如果您使用multiprocessing.cpu_count() ,您的脚本可能会尝试使用比可用内核更多的内核,这可能导致过载和超时。

通过限制与taskset实用程序的相似性,我们可以具体看到差异。

例如,如果我在16核系统中将Python限制为仅1核(0核):

taskset -c 0 ./main.py

使用测试脚本:

main.py

#!/usr/bin/env python3import multiprocessing
import osprint(multiprocessing.cpu_count())
print(len(os.sched_getaffinity(0)))

那么输出是:

16
1

但是, nproc在默认情况下确实遵守关联性,并且:

taskset -c 0 nproc

输出:

1

man nproc对此非常明确:

打印可用的处理单元数

对于要获取物理CPU计数的较不常见的情况, nproc具有--all标志:

taskset -c 0 nproc --all

该方法的唯一缺点是,它似乎仅适用于UNIX。 我认为Windows必须具有类似的相似性API,可能是SetProcessAffinityMask ,所以我想知道为什么还没有移植它。 但是我对Windows一无所知。

已在Ubuntu 16.04,Python 3.5.2中进行了测试。


#13楼

这对于使用不同操作系统/系统但想要获得世界最佳状态的我们来说可能是有用的:

import os
workers = os.cpu_count()
if 'sched_getaffinity' in dir(os):workers = len(os.sched_getaffinity(0))

如何使用python找出CPU数量相关推荐

  1. python虚拟cpu性能_如何使用python找出CPU数量

    I want to know the number of CPUs on the local machine using Python. The result should be user/real ...

  2. python找出素数_[Python 1] 如何使用Python找质数?

    学习生物信息需要熟练掌握一门甚至多门编程语言,比如Python.R.C++,这取决于你的需求. 但语言只是工具,最关键的是如何合理使用工具去解决生物学问题,这需要你去多写.多查.多看来锻炼.不然给你把 ...

  3. 震惊!小伙竟然用python找出了马大师视频中的名场面

    震惊!小伙竟然用python找出了马大师视频中的名场面 前言 一.爬取视频弹幕 二.弹幕分析 1. 弹幕频数统计 2. 绘制频数分布图 3. 标红高潮部分 三.大师的名场面 写在最后 前言 最近江湖中 ...

  4. 在哪里能收到python实例代码-Python找出最小的K个数实例代码

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 这个题目完成的思路有很多,很多排序算法都可以完成既定操作,关键是复 ...

  5. Python找出列表中出现次数最多的元素三种方式

    通过三种方式给大家介绍,具体详情如下所示: 方式一: 原理:创建一个新的空字典,用循环的方式来获取列表中的每一个元素,判断获取的元素是否存在字典中的key,如果不存在的话,将元素作为key,值为列表中 ...

  6. linux 端口tnpl,利用Python找出9个连续的空闲端口

    这篇文章主要介绍了Python找出9个连续的空闲端口的方法,感兴趣的小伙伴们可以参考一下 一.项目需求 安装某软件,配置时候需要填写空闲的端口.查看5个平台的某个端口是否被占用 5个平台为window ...

  7. Top命令找出CPU占用较高的Java线程信息

    Top命令找出CPU占用较高的Java线程信息 由于种种原因导致生产环境的应用CPU占用奇高, 这个时候就需要确定到底是哪些线程占用了较高的CPU, 然后再做针对性的优化, 可以使用jconsole/ ...

  8. python找出某个文件夹下某个后缀的文件

    python找出某个文件夹下某个后缀的文件 import osdef find_files_with_suffix(folder_path, suffix):# 使用os模块获取文件夹中所有文件的路径 ...

  9. python找最长的单词,Python 找出英文单词列表(list)中最长单词链

    这篇文章主要介绍了Python 找出英文单词列表(list)中最长单词链,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 本文主要 ...

最新文章

  1. MATLAB常用的学习的网站
  2. MyBatis学习--简单的增删改查
  3. unity android 集成指南
  4. Linq to sql 消除列重复 去重复
  5. EF 实现自定义数据库字符串
  6. 二分算法:平均值(洛谷 UVA1451)
  7. ResultSet转换为List的方法
  8. 如何远程登录连接Linux云服务器(电脑端/移动端)?
  9. 数学基础加强1---机器学习与数学分析
  10. 网吧电影视频服务器架设完全入门教程(转)
  11. Big Mart Sales:预测销售结果 |Python
  12. 103个后台PSD源文件、素材网站
  13. Java高级框架——Spring学习
  14. [解读] Unsupervised Feature Learning via Non-Parametric Instance Discrimination
  15. Android 文件存储系统
  16. 为Visual SVN Server添加认证用户IP功能
  17. 拜日式精准引导词_瑜伽 拜日式引导词 分享
  18. 西门子1200 压力PID调节实操
  19. 现要为某一个销售部门编写一个程序管理约100种商品。要求设计一个结构体类型来描述商品,每种商品包括商品编号(如A001)、商品名称、商品销售量和商品销售额等信息,并编写以下函数···········
  20. 2022年(金融保险)金融行业几个比较热门的证书

热门文章

  1. Android Camera 预览拉伸
  2. Android App压力测试(Monkey和ADB)
  3. bp神经网络算法步流程_基于遗传算法的BP神经网络优化算法模板
  4. iOS的类方法和实例方法区别与使用
  5. (0095)iOS开发之本地文件预览的三种方法(3)
  6. swift_040(Swift闭包声明与用途)
  7. (0021)iOS 开发之-苹果官方文档
  8. dxf转nc代码软件_eCAM高速激光加工软件
  9. 2017-2018-1 20155226《信息安全系统设计基础》第2周学习总结
  10. C++设计模式 之 “组件协作”模式:Template Method、Strategy、Observer