<p>我希望<code>subprocess</code>比<code>command</code>慢。如果不想暗示这是脚本运行缓慢的原因,您应该看看<a href="http://hg.python.org/cpython/file/477508efe4ab/Lib/commands.py" rel="nofollow noreferrer">^{<cd3>}</a>源代码。只有不到100行代码,而且大部分工作都委托给<code>os</code>中的函数,其中许多是直接从c posix库(至少在posix系统中)获取的。请注意,<code>commands</code>仅限于unix,因此它不需要做任何额外的工作来确保跨平台兼容性。</p>
<p>现在看看<a href="http://hg.python.org/cpython/file/477508efe4ab/Lib/subprocess.py" rel="nofollow noreferrer">^{<cd1>}</a>。有1500多行代码,都是纯Python,它们执行各种检查以确保跨平台行为的一致性。基于此,我希望<code>subprocess</code>的运行速度比<code>commands</code>慢。</p>
<p>我给这两个模块计时,基本上,<code>subprocess</code>的速度几乎是<code>commands</code>的两倍。</p>
<pre><code>>>> %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
</code></pre>
<p><a href="https://stackoverflow.com/a/10889406/577088">Swiss</a>建议一些有助于脚本性能的良好改进。但即使在应用了它们之后,也要注意<code>subprocess</code>仍然要慢一些。</p>
<pre><code>>>> %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
</code></pre>
<p>假设您连续执行以上命令多次,那么这将累加起来,并至少说明了一些性能差异。</p>
<p>无论如何,我将您的问题解释为<code>subprocess</code>和<code>command</code>的相对性能,而不是如何加快脚本的速度。对于后一个问题,瑞士的回答更好。</p>