python - 为 Python 处理其输出的外部程序计时

标签 python external timing

我想测量我的 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 命令。这是原则:

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时间(real是挂钟时间,一般不代表处理器占用多少程序使用的时间:例如,sleep 5real 时间是 5 秒,而 usersys code> 次为 0)。

这是有效的,因为 time 输出了对实际执行时间的详细说明(不仅仅是墙上时间,这取决于其他正在运行的进程等),并且对标准错误也是如此输出。您可以解析标准错误并获取时序信息。

如果您的程序将数据输出到可能干扰 time 命令解析的标准错误,则此方法可能不实用。

此外,我还没有检查过上面的代码不会发生死锁(我不确定如果调用的程序向标准错误打印很多内容会发生什么:程序是否会阻塞直到标准错误缓冲区是读取,如果 Python 程序正在读取标准输出,这可能不会发生?)。也就是说,如果你知道定时程序没有或只有很少的标准错误数据,我相信上面的代码不会死锁。

关于python - 为 Python 处理其输出的外部程序计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15787735/

相关文章:

python - 在Python中生成概率分布时处理精度误差

Python smtplib 破坏 html 电子邮件

python - 这个介绍 Flask 代码中发生了什么?

android 无法从外部 jar 中找到类

javascript - 使用 javascript performance.now() 计时

c++定时相同的循环给出不同的结果

python - 给定元组形式的索引列表,遍历列表列表

javascript - jQuery 或 Javascript - 根据环境动态更改链接(相对/站点相对/绝对)

javascript 到外部 .js 文件

matlab - 访问结构体与 "loose"变量所需的时间