我想测量我的 Python 脚本使用其输出的外部程序的执行时间。
Calling extprogram
产生输出的程序,目前我做了类似的事情:
import time
import subprocess
def process_output(line):
...
...
return processed_data
all_processed_data = []
ts = time.time()
p = subprocess.Popen("extprogram", stdout=subprocess.PIPE)
for line in p.stdout:
all_processed_data.append(process_output(line))
te = time.time()
elapsed_time = te - ts
这没有按预期工作,因为我测量的是执行时间extprogram
加上处理其输出所需的时间。
extprogram
产生大量数据,因此我想像现在一样使用循环将其输出“流”到我的 Python 程序中。
我该如何评价te
when extprogram
终止而不是等待所有输出被处理?
由于您在 Unix 下,您可以使用time
命令。原理如下:
import sys
import subprocess
p = subprocess.Popen(["time", "ls"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for line in p.stdout: # ls output
sys.stdout.write(line)
time_output = p.stderr.readlines()
print "Stderr:", ''.join(time_output)
在我的机器上,这给出了:
Stderr: 0.01 real 0.00 user 0.00 sys
总处理器时间是user
+ sys
time (real
是挂钟时间,它通常不代表程序使用了多少处理器时间:例如,sleep 5
, the real
时间为 5 秒,而user
and sys
次数为 0)。
这有效是因为time
输出实际执行时间的详细统计(不仅仅是挂机时间,这取决于正在运行的其他进程等),并将其输出到标准错误输出。您可以解析标准错误并获取计时信息。
如果您将数据输出到标准错误(可能会干扰解析),则此方法可能不实用。time
命令。
另外,我还没有检查上面的代码不会发生死锁(我不确定如果调用的程序向标准错误打印很多内容会发生什么:程序是否会阻塞直到读取标准错误缓冲区,这如果Python程序正在读取标准输出,可能不会发生?)。也就是说,如果您知道定时程序的标准错误没有或很少有数据,我相信上面的代码不会死锁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)