如何检测不同运行时长Python脚本的CPU和内存资源占用情况?
短时长脚本CPU与内存占用对比方案
psutil完全可以满足你的需求,只需要调整调用方式避免阻塞即可,以下是具体实现逻辑:
调整psutil的cpu_percent调用逻辑
psutil.cpu_percent()传入interval=0参数时不会阻塞等待,而是返回上一次调用该函数到本次调用之间的CPU使用率,完全适配毫秒级的进程监控场景:
- 使用
psutil.Popen()启动目标脚本作为子进程 - 进程启动后立刻调用一次子进程的
cpu_percent(interval=0)初始化统计基准,这次返回值无实际意义 - 以1~10ms的间隔轮询子进程状态,每次轮询时记录
cpu_percent(interval=0)和memory_info().rss的数值 - 子进程退出后,取CPU采样的平均值/峰值、内存采样的峰值作为对应脚本的资源占用指标
超短时长脚本优化方案
对于运行时长小于10ms的脚本,轮询采样可能无法覆盖完整生命周期,可改用进程累计CPU时间计算整体使用率:
- 启动子进程时记录系统时间
t1,子进程退出时记录系统时间t2,计算总运行时长runtime = t2 - t1 - 读取子进程退出后的
cpu_times()属性,累加用户态CPU时间user和内核态CPU时间system得到总CPU消耗时间cpu_total - 整体CPU使用率计算公式为
(cpu_total / runtime) * 100% - 内存指标可读取进程退出前最后一次采样的RSS值,或对应平台的进程内存峰值统计接口
参考实现代码
import psutil import time def monitor_script(script_cmd): # 启动目标脚本子进程 proc = psutil.Popen(script_cmd, shell=False) # 初始化CPU统计基准 proc.cpu_percent(interval=0) start_time = time.perf_counter() cpu_samples = [] memory_samples = [] while proc.is_running(): try: cpu_samples.append(proc.cpu_percent(interval=0)) memory_samples.append(proc.memory_info().rss) time.sleep(0.001) # 采样间隔可根据需求调整 except psutil.NoSuchProcess: break runtime = time.perf_counter() - start_time # 统计最终指标 avg_cpu = sum(cpu_samples) / len(cpu_samples) if cpu_samples else 0 peak_memory = max(memory_samples) if memory_samples else 0 # 基于累计CPU时间计算的CPU使用率 cpu_times = proc.cpu_times() total_cpu = cpu_times.user + cpu_times.system total_cpu_usage = (total_cpu / runtime) * 100 if runtime > 0 else 0 return { "runtime_s": round(runtime, 6), "avg_cpu_percent": round(avg_cpu, 2), "total_cpu_percent": round(total_cpu_usage, 2), "peak_memory_kb": round(peak_memory / 1024, 2) }
测试注意事项
- 单个脚本建议重复运行10~100次取统计平均值,消除系统调度带来的随机误差
- 测试期间关闭无关后台进程,避免资源抢占影响测试结果
- 若需要更高精度的指标,可配合操作系统原生工具辅助测试,比如Linux下的
time命令、perf工具,Windows下的性能计数器等
内容的提问来源于stack exchange,提问作者learnPyt
相关产品推荐
相关产品推荐

