1

给定一个非常简单的脚本,例如:

import subprocess

while True:
    x = subprocess.Popen('ls -ltr /usr/lib', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

我在笔记本电脑的 Ubuntu 12.04(32 位)celeron 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 使用率如此之低且如此不同?我在core i5和atom ubuntus上试过这个,结果接近100%(3.2)和80%(2.7)。上面没有其他内容,我的平台有什么问题?

4

1 回答 1

1

至少有一些问题是您使用磁盘而不是 CPU 来执行其中一些命令。“ls -l /usr/lib”肯定会涉及磁盘访问(因为它在每个文件上运行 stat()):我可以相信加载 gcc 涉及的磁盘访问更少,而 shell 内置 pwd 甚至更少。

我也可以相信,也许 os.popen、subprocess.Popen 和 Python3 版本在它们是否产生新的 shell、shell 具有哪些属性(以及因此是否必须从磁盘读取 /etc/profile)和很快。

正如评论已经说过的那样,计算密集型工作将使您获得比“ls -l”等IO密集型工作更高的CPU使用率。以下让我很好地达到了 100% CPU:

while True:
    a = 11*11
于 2013-02-13T20:49:04.783 回答