我想测量一个外部程序的执行时间,该程序的输出由Python脚本使用。在
调用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程序中“流式”它的输出。
当extprogram
终止而不是等待所有输出被处理时,如何计算te
?在
由于您使用的是Unix,所以可以使用
time
命令。原则如下:在我的机器上,它提供:
^{pr2}$处理器总时间是}时间为0)。在
user
+sys
时间(real
是挂钟时间,它通常不表示程序使用了多少处理器时间:例如,sleep 5
,real
时间为5秒,user
和{这是因为
time
输出了对实际执行时间(不仅仅是墙时间,它取决于其他进程正在运行的时间等)的详细计算,并将其输出到标准错误输出。您可以解析标准错误并获得计时信息。在如果将输出数据编程为标准错误,则此方法可能不实用,因为该错误可能会干扰
time
命令的解析。在另外,我还没有检查上面的代码是否不会发生死锁(我不确定如果调用的程序大量打印到标准错误会发生什么:程序是否会在读取标准错误缓冲区之前阻塞,如果Python程序正在读取标准输出,则可能不会发生这种情况?)。也就是说,如果您知道定时程序没有或很少有关于其标准错误的数据,我相信上面的代码不会死锁。在
下面的代码仍然使用“挂钟”时间,但可以替代使用主机系统时间命令。执行和计时被分成单独的线程,在执行任何处理之前可以停止计时器。在
这样可以得到以下输出:
^{pr2}$或者您可以将接收“extprogram”的输出与处理输出分开。在
例如:
相关问题 更多 >
编程相关推荐