我希望subprocess
比慢command
。无意暗示这是脚本运行缓慢的 唯一 原因,您应该查看commands
源代码。少于100行,并且大部分工作委托给的函数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
假设您连续多次执行上述命令,这将加起来,并至少解决了部分性能差异。
无论如何,我将您的问题解释为与subprocess
和的相对性能有关command
,而不是有关如何加快脚本的速度。对于后一个问题,瑞士人的答案更好。