给出一个非常简单的脚本:
import subprocess
while True:
x = subprocess.Popen('ls -ltr /usr/lib', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
我在笔记本电脑的Ubuntu 12.04(32位),赛扬2核上获得了以下“顶级”CPU使用率:
x = subprocess.Popen('ls -l /usr/lib', ...
python3.2.3: 6%, python2.7.3: 5% (ls 0%)
x = subprocess.Popen('gcc --version', ...
python3.2.3: 22%, python2.7.3: 18% (gcc 0%)
x = subprocess.Popen('pwd', ...
python3.2.3: 47%, python 2.7.3: 35% (pwd 0%)
如果subprocess.Popen被os.popen替换,结果会有所不同:
x = os.popen('ls /usr/lib').read()
python3.2.3: 8%, python2.7.3: 3% (gcc 0%)
x = os.popen('gcc --version').read()
python3.2.3: 45%, python 2.7.3: 9%
x = os.popen('pwd').read()
python3.2.3: 68%, python 2.7.3: 22%
为什么cpu使用率如此之低且如此不同?我在核心i5和原子ubuntus上尝试了这个,结果接近100%(3.2)和80%(2.7)。顶级没什么,我的平台出了什么问题?
答案 0 :(得分:1)
至少有一些问题是你使用磁盘而不是CPU使用其中一些命令。 “ls -l / usr / lib”肯定会涉及磁盘访问(因为它在每个文件上运行stat()):我可以相信加载gcc涉及更少的磁盘访问,并且内置的pwd更少。
我也相信也许os.popen,subprocess.Popen和Python3版本在它们是否会产生一个新的shell,它具有什么属性(以及例如它是否必须从磁盘读取/ etc / profile)方面存在差异),等等。
正如评论已经说过的那样,计算密集型工作将使您的CPU使用率高于IO-bound工作,如“ls -l”。下面给我带来了100%的CPU:
while True:
a = 11*11