所以我写了一个脚本,在命令行上使用nc访问一堆服务器,最初我使用Python的命令模块并调用commands.getoutput(),脚本在大约45秒内运行.由于命令已弃用,我想将所有内容更改为使用子进程模块,但现在脚本需要2m45s才能运行.任何人都知道为什么会这样?
我之前的所作所为:
output = commands.getoutput("echo get file.ext | nc -w 1 server.com port_num")
我现在有
p = Popen('echo get file.ext | nc -w 1 server.com port_num', shell=True, stdout=PIPE)
output = p.communicate()[0]
先谢谢您的帮助!
解决方法:
我希望subprocess比命令慢.没有意义表明这是脚本运行缓慢的唯一原因,您应该查看commands
源代码.少于100行,并且大部分工作被委托给os的函数,其中许多是直接从c posix库中获取的(至少在posix系统中).请注意,命令仅限unix,因此无需执行任何额外工作即可确保跨平台兼容性.
现在看一下subprocess
.有超过1500行,都是纯Python,进行各种检查以确保一致的跨平台行为.基于此,我希望子进程比命令运行慢.
我对两个模块进行了计时,并且在一些非常基本的模块上,子进程的速度几乎是命令的两倍.
>>> %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提出了一些有助于您的脚本性能的良好改进.但即使应用它们,请注意子进程仍然较慢.
>>> %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
假设您连续多次执行上述命令,这将累加起来,并至少考虑一些性能差异.
无论如何,我将你的问题解释为关于子进程和命令的相对性能,而不是关于如何加速你的脚本.对于后一个问题,瑞士的答案更好.