如何按id分组统计响应时间的均值、中位数等指标并存入字典?
实现方案
核心思路
原代码存在缩进错误(计数逻辑写在循环外,只会处理最后一条日志),且没有存储全量响应时间,调整方案如下:
- 用
collections.defaultdict(list)存储每个id对应的所有响应时间数值,不需要单独维护计数,直接取列表长度即可 - 遍历日志行时跳过注释行、空行,同时把响应时间转为数值类型存储
- 遍历完成后针对每个id的响应时间列表计算所需指标
可运行代码
from collections import defaultdict, Counter # 存储每个id对应的响应时间列表,自动处理key不存在的情况 id_rt_map = defaultdict(list) # 直接逐行读文件,不需要额外存所有行到列表,节省内存 with open("logs.txt", "r") as f: for line in f: line = line.strip() # 跳过空行和注释行 if not line or line.startswith("#"): continue parts = line.split() # 提取id和响应时间,转成数值 log_id = parts[0].split("=")[1] rt = int(parts[1].split("=")[1]) id_rt_map[log_id].append(rt) # 逐个计算指标并输出 for log_id, rt_list in id_rt_map.items(): # 1. 计数 count = len(rt_list) # 2. 平均响应时间 avg_rt = sum(rt_list) / count # 3. 众数:如果有多个众数取第一个出现的 mode_rt = Counter(rt_list).most_common(1)[0][0] # 4. 中位数:先排序再计算 sorted_rt = sorted(rt_list) mid = count // 2 if count % 2 == 1: median_rt = sorted_rt[mid] else: median_rt = (sorted_rt[mid-1] + sorted_rt[mid]) / 2 # 按要求格式输出 print(log_id) print(f" count = {count}") print(f" avg_response_time = {avg_rt}") print(f" mode_response_time = {mode_rt}") print(f" median_response_time = {median_rt}")
优化建议
- 内存优化:不要先把所有日志行存到临时列表再遍历,直接逐行读取处理,日志文件很大的时候可以大幅降低内存占用
- 鲁棒性优化:增加非法行的异常捕获逻辑,避免部分格式错误的行导致整个程序崩溃
- 性能优化:如果响应时间取值范围很小(比如都是整数且范围在0-1000),可以不用存全量列表,直接存每个响应时间的出现频次,计算所有指标的时候用频次表计算,进一步降低内存占用,适合超大规模日志的场景
- 众数兼容:如果需要处理多个众数的场景,可以调整众数计算逻辑,取出所有出现频次最高的响应时间输出
内容的提问来源于stack exchange,提问作者DevBabai
相关产品推荐
相关产品推荐

