输出由Python处理的外部程序的时间

2024-09-30 08:23:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想测量一个外部程序的执行时间,该程序的输出由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?在


Tags: import程序outputdatatimestdoutline时间
2条回答

由于您使用的是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)

在我的机器上,它提供:

^{pr2}$

处理器总时间是user+sys时间(real是挂钟时间,它通常不表示程序使用了多少处理器时间:例如,sleep 5real时间为5秒,user和{}时间为0)。在

这是因为time输出了对实际执行时间(不仅仅是墙时间,它取决于其他进程正在运行的时间等)的详细计算,并将其输出到标准错误输出。您可以解析标准错误并获得计时信息。在

如果将输出数据编程为标准错误,则此方法可能不实用,因为该错误可能会干扰time命令的解析。在

另外,我还没有检查上面的代码是否不会发生死锁(我不确定如果调用的程序大量打印到标准错误会发生什么:程序是否会在读取标准错误缓冲区之前阻塞,如果Python程序正在读取标准输出,则可能不会发生这种情况?)。也就是说,如果您知道定时程序没有或很少有关于其标准错误的数据,我相信上面的代码不会死锁。在

下面的代码仍然使用“挂钟”时间,但可以替代使用主机系统时间命令。执行和计时被分成单独的线程,在执行任何处理之前可以停止计时器。在

from multiprocessing import Event
import threading
import time
import subprocess

def timing(event):
    print "timer starts"
    ts = time.time()
    event.wait()
    te = time.time()
    elapsed_time = te - ts
    print "Elapsed Time " + str(elapsed_time)

def execution(event): 
    for i in range(0,1000):
        p = subprocess.Popen("ls", stdout=subprocess.PIPE)
    event.set()

if __name__ == '__main__':  
    event = Event()
    e = threading.Thread(target=execution, args=(event,))
    t = threading.Thread(target=timing, args=(event,))
    t.start()  
    e.start() 
    while not event.is_set():
        print "running..."
        time.sleep(1)

这样可以得到以下输出:

^{pr2}$

或者您可以将接收“extprogram”的输出与处理输出分开。在

例如:

ts = time.time()
p = subprocess.Popen("extprogram", stdout=subprocess.PIPE)

for line in p.stdout:
    tempdata.append(line)

te = time.time()
elapsed_time = te - ts

for line in tempdata:
    all_processed_data.append(process_output(line))

相关问题 更多 >

    热门问题