You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取Python中多个subprocess子进程的执行时间?

解决Linux命令执行计时问题

咱们可以通过在启动子进程时记录起始时间,循环检查poll()状态直到进程正常结束,再计算时间差来实现你的需求。这里用time.perf_counter()来计时,它比time.time()精度更高,适合测量短时间间隔,还不受系统时间调整的影响。

下面是完整的实现代码:

import time
import shlex
from subprocess import Popen, PIPE

# 待执行的命令列表
commands = ['sleep 5', 'ls -l', 'find /usr', 'sleep 3', 'uptime']
# 用来存储命令与对应耗时的字典
command_time_dict = {}

for command in commands:
    cmd = shlex.split(command)
    # 记录进程启动的精确时间
    start_ts = time.perf_counter()
    # 启动子进程(注:shell=True时其实不需要shlex.split,保留你的写法也能正常运行)
    proc = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE)
    
    # 循环轮询进程状态,直到poll()返回0(进程正常结束)
    while proc.poll() is None:
        # 加个短暂休眠,避免CPU空转
        time.sleep(0.01)
    
    # 计算实际耗时,保留四位小数
    elapsed_time = round(time.perf_counter() - start_ts, 4)
    # 把结果存入字典
    command_time_dict[command] = elapsed_time

# 按你要求的格式打印结果
print("- Commands Time(secs)")
for cmd, cost in command_time_dict.items():
    print(f"- {cmd} {cost}")

关键细节说明:

  • 计时精度:选用time.perf_counter()是因为它专门用于测量短时间间隔,精度比time.time()高很多,不会因为系统时间同步而出现误差。
  • 进程状态判断proc.poll()会返回进程的退出码,进程运行中返回None,正常结束返回0,我们以此作为计时结束的标志,完全符合你的要求。
  • 结果存储:用字典存储可以方便后续按命令查询耗时,打印时直接遍历字典就能输出你要的列表格式。

示例输出(实际耗时随环境略有差异):

- Commands Time(secs)
- sleep 5 5.0037
- ls -l 0.0014
- find /usr 2.0892
- sleep 3 3.0021
- uptime 0.0008

内容的提问来源于stack exchange,提问作者hamood

火山引擎 最新活动