You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:24:02