如何用Python准确测量进程的平均CPU使用率?
Python测量进程平均CPU使用率的准确方法
问题描述
我想要用Python测量某个进程的平均CPU使用率。使用psutil只能获取某一时刻的CPU消耗情况,于是我编写了如下代码:
import psutil import time start = time.time() end = time.time() samples = [] while end - start < 2: for proc in psutil.process_iter(): if proc.name() == "myprocess": samples.append(proc.cpu_percent()) break end = time.time() print("Average: " + str(sum(samples)/len(samples)))
但结果并不准确,因为该进程有时会进入休眠状态(不占用CPU),导致samples列表中出现大量0值。请问是否存在可以直接测量进程平均CPU使用率的内置函数?
解决方法
psutil其实提供了更合适的方式来计算进程的平均CPU使用率,不需要自己循环采样。以下两种方法都能解决你的问题:
方法1:利用cpu_percent(interval)直接获取时间段平均值
cpu_percent()方法支持传入interval参数(单位秒),它会在指定时间段内统计进程的CPU使用情况,返回的结果就是这段时间的平均使用率,不会出现频繁采样导致的0值干扰。
示例代码:
import psutil # 定位目标进程 target_proc = None for proc in psutil.process_iter(): if proc.name() == "myprocess": target_proc = proc break if target_proc: # 测量2秒内的平均CPU使用率 avg_cpu = target_proc.cpu_percent(interval=2) print(f"Average: {avg_cpu}%") else: print("未找到目标进程")
注意:调用该方法时程序会阻塞interval时长,因为它需要这段时间来完成统计。
方法2:通过CPU时间差值手动计算(非阻塞可选)
如果不想让程序阻塞,可以通过记录进程的CPU时间和系统时间的差值来计算平均使用率,这样能更灵活地控制统计周期:
import psutil import time # 定位目标进程 target_proc = None for proc in psutil.process_iter(): if proc.name() == "myprocess": target_proc = proc break if target_proc: # 记录初始状态:进程CPU总耗时(用户态+内核态)和系统时间 cpu_times_start = target_proc.cpu_times() start_cpu = cpu_times_start.user + cpu_times_start.system start_time = time.time() # 等待统计周期(这里用sleep模拟,也可以用非阻塞逻辑) time.sleep(2) # 记录结束状态 cpu_times_end = target_proc.cpu_times() end_cpu = cpu_times_end.user + cpu_times_end.system end_time = time.time() # 计算时间差与CPU使用率 elapsed_time = end_time - start_time cpu_used = end_cpu - start_cpu # 需除以CPU核心数,因为psutil的CPU使用率是按核心数归一化的 avg_cpu = (cpu_used / elapsed_time) * 100 / psutil.cpu_count() print(f"Average: {avg_cpu:.2f}%") else: print("未找到目标进程")
原代码不准确的原因
你的代码是频繁采样瞬间CPU使用率,当进程休眠时瞬间采样结果为0,这些0会拉低平均值。而实际需要的是一段时间内进程占用CPU的总比例,不是多个瞬间值的简单平均。
内容的提问来源于stack exchange,提问作者rudeus123
相关产品推荐
相关产品推荐

