我想用Python知道本地机器上cpu的数量。当使用一个优化伸缩的仅用户空间的程序调用时,结果应该是user/real作为时间(1)的输出。


当前回答

你也可以使用“joblib”来达到这个目的。

import joblib
print joblib.cpu_count()

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

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

import numexpr as ne
print ne.detect_number_of_cores()

其他回答

另一种选择是使用psutil库,它在这些情况下总是很有用:

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

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

注意在某些情况下多处理。cpu_count可能引发NotImplementedError,而psutil将能够获得cpu的数量。这只是因为psutil首先尝试使用多处理所使用的相同技术,如果这些技术失败,它还会使用其他技术。

如果您对当前进程可用的处理器数量感兴趣,则必须首先检查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, 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')

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

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

hwloc被设计为跨操作系统和架构可移植。

如果你想知道物理内核的数量(不是虚拟超线程内核),这里有一个独立于平台的解决方案:

psutil.cpu_count(logical=False)

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

注意,logical的默认值是True,所以如果你想包含超线程核心,你可以使用:

psutil.cpu_count()

这将给出与os.cpu_count()和multiprocessing.cpu_count()相同的数字,这两个都没有逻辑关键字参数。

如果你使用手电筒,你可以做:

import torch.multiprocessing as mp

mp.cpu_count()

torch中的mp库具有与python主库相同的接口,所以你也可以这样做,正如评论者所提到的:

python -c "import multiprocessing; print(multiprocessing.cpu_count())"

希望这能有所帮助!;)有多个选择总是好的。