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 をロードするとディスク アクセスが少なくなり、シェル組み込みの pwd はさらに少なくなると思います。

また、os.popen、subprocess.Popen、および Python3 バージョンでは、新しいシェルを生成するかどうか、シェルが持つ属性 (つまり、ディスクから /etc/profile を読み取る必要があるかどうかなど) に違いがあると考えることもできます。すぐ。

コメントが既に述べているように、計算集約的な作業は、「ls -l」のような IO バウンドの作業よりも CPU 使用率が高くなります。以下は、私を100%のCPUに非常にうまくもたらします:

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