我预计subprocess
会比command
. 无意暗示这是您的脚本运行缓慢的唯一原因,您应该查看commands
源代码。不到 100 行,大部分工作都委托给 from 的函数os
,其中许多直接取自 c posix 库(至少在 posix 系统中)。请注意,这commands
仅适用于 unix,因此无需进行任何额外工作即可确保跨平台兼容性。
现在来看看subprocess
。有 1500 多行,全部是纯 Python,做各种检查以确保一致的跨平台行为。基于此,我希望subprocess
运行速度比commands
.
我对这两个模块进行了计时,在一些非常基本的东西上,subprocess
它的速度几乎是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
假设您连续多次执行上述命令,这将加起来,并至少解释一些性能差异。
无论如何,我将您的问题解释为关于 and 的相对性能subprocess
,command
而不是关于如何加快脚本的速度。对于后一个问题,Swiss 的回答更好。