如何获取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




