subprocess
よりも遅いと思いcommand
ます。これがスクリプトの実行速度が遅い唯一の理由であると示唆する意味はありませんが、commands
ソース コードを確認する必要があります。100 行未満であり、ほとんどの作業は の関数に委譲されておりos
、その多くは (少なくとも posix システムでは) c posix ライブラリから直接取得されています。これcommands
は unix 専用であるため、クロスプラットフォームの互換性を確保するために追加の作業を行う必要はありません。
を見てみましょうsubprocess
。1500 以上の行があり、すべて純粋な Python であり、あらゆる種類のチェックを行って、一貫したクロスプラットフォームの動作を保証します。subprocess
これに基づいて、より遅く実行されると予想されますcommands
。
私は 2 つのモジュールの時間を計りましたが、非常に基本的なものでsubprocess
は、ほぼ 2 倍の速度commands
でした。
>>> %timeit commands.getoutput('echo "foo" | cat')
100 loops, best of 3: 3.02 ms per loop
>>> %timeit subprocess.check_output('echo "foo" | cat', shell=True)
100 loops, best of 3: 5.76 ms per loop
Swissは、スクリプトのパフォーマンスを向上させるいくつかの優れた改善点を提案しています。ただし、それらを適用した後でも、まだ遅いことsubprocess
に注意してください。
>>> %timeit commands.getoutput('echo "foo" | cat')
100 loops, best of 3: 2.97 ms per loop
>>> %timeit Popen('cat', stdin=PIPE, stdout=PIPE).communicate('foo')[0]
100 loops, best of 3: 4.15 ms per loop
上記のコマンドを連続して何度も実行すると仮定すると、これが合計され、少なくともパフォーマンスの違いの一部が説明されます。
いずれにせよ、私はあなたの質問を、スクリプトを高速化する方法ではなく、subprocess
との相対的なパフォーマンスに関するものとして解釈しています。command
後者の質問については、Swiss の回答の方が適切です。