我认为 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
的相对性能,而不是关于如何加速脚本的问题。针对后者的问题,Swiss的回答更好。