如何找出使用python的CPU数量

我想知道本地机器上使用Python的CPU数量。 结果应该是user/real输出的time(1)当调用一个最佳缩放用户空间的程序。

如果你有一个版本> = 2.6的Python,你可以简单地使用

 import multiprocessing multiprocessing.cpu_count() 

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

如果您对当前进程可用的处理器数量感兴趣,则必须先检查cpuset 。 否则(或者如果没有使用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, ie 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') 

另一个select是使用psutil库,在这种情况下总是很有用:

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

这应该适用于任何由psutil (Unix和Windows)支持的平台。

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

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

multiprocessing.cpu_count()是根据这个函数实现的,但是如果os.cpu_count()返回None (“不能确定CPU数量” os.cpu_count()则会引发NotImplementedError

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旨在跨操作系统和体系结构进行移植。

平台独立:

psutil.cpu_count(逻辑=假)

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

不知道如何添加到代码或回复消息,但这里是jython的支持,你可以在放弃之前join:

 # 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() 

这个方法会给你系统中的cpu数量。 joblib需要安装。 关于joblib的更多信息可以在这里findhttps://pythonhosted.org/joblib/parallel.html

或者,你可以使用Python的numexpr包。 它有很多简单的function有助于获取有关系统CPU的信息。

 import numexpr as ne print ne.detect_number_of_cores() 

另一个select,如果你没有Python 2.6:

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