代码之家  ›  专栏  ›  技术社区  ›  phihag

如何使用python找出CPU的数量

  •  394
  • phihag  · 技术社区  · 15 年前

    我想知道使用python的本地计算机上的CPU数量。结果应该是 user/real 作为输出 time(1) 当用一个只对用户空间进行最佳缩放的程序调用时。

    11 回复  |  直到 6 年前
        1
  •  685
  •   anthony sottile    9 年前

    如果您有版本为>=2.6的python,则只需使用

    import multiprocessing
    
    multiprocessing.cpu_count()
    

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

        2
  •  156
  •   phihag    6 年前

    如果你对处理器的数量感兴趣 可获得的 对于您当前的流程,您必须检查 cpuset 第一。否则(或者如果cpuset未使用), multiprocessing.cpu_count() 是进入Python2.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')
    
        3
  •  69
  •   leezu lgautier    7 年前

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

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

    这应该在支持的任何平台上工作 普苏尔 (Unix和Windows)。

    注意在某些情况下 multiprocessing.cpu_count 可以养一个 NotImplementedError 虽然 普苏尔 将能够获得CPU的数量。这只是因为 普苏尔 首先尝试使用 multiprocessing 如果失败了,它也会使用其他技术。

        4
  •  32
  •   jfs    10 年前

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

    multiprocessing.cpu_count() 根据此函数实现,但引发 NotImplementedError 如果 os.cpu_count() 收益率 None (无法确定CPU数量)。

        5
  •  25
  •   Davoud Taghawi-Nejad    8 年前

    独立于平台:

    psutil.cpu_计数(逻辑=假)

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

        6
  •  22
  •   Khalil Al Hooti    6 年前
    import os
    
    print(os.cpu_count())
    
        7
  •  15
  •   Douglas B. Staple    10 年前

    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设计为可跨OSE和体系结构进行移植。

        8
  •  7
  •   Ben Scherrey    14 年前

    无法确定如何添加代码或回复消息,但这里有对Jython的支持,您可以在放弃之前附加这些支持:

    # jython
    try:
        from java.lang import Runtime
        runtime = Runtime.getRuntime()
        res = runtime.availableProcessors()
        if res > 0:
            return res
    except ImportError:
        pass
    
        9
  •  3
  •   amit12690    9 年前

    您也可以使用“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()
    
        10
  •  0
  •   DanM7    10 年前

    如果没有python 2.6,另一个选项是:

    import commands
    n = commands.getoutput("grep -c processor /proc/cpuinfo")
    
        11
  •  0
  •   user9177539    6 年前

    这是多处理的CPU计数函数

    :}

    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')
    
    推荐文章