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

Python中For循环与条件判断的嵌套优化问题咨询

Python多层嵌套循环优化方案

问题分析

你原有代码的四层嵌套循环时间复杂度极高,当data_breakdown、data_source_ids、camera_ids、result四个列表的数据量较大时,运行性能会非常差。

你尝试编写的单行代码无法运行有三个核心原因:

  • 缺失了外层对data_breakdown、data_source_ids的遍历逻辑
  • 没有处理result列表的匹配逻辑,直接调用res.get()会报变量未定义错误
  • 单独写的生成式表达式没有被执行,且update是原地操作返回None,写在推导式中没有实际意义

优化方案

优先通过构建索引映射降低时间复杂度,这比强行压缩代码行数的优先级高得多:

步骤1:提前构建索引映射

# 1. 将result按camera_id分组,避免每次遍历全量result匹配
res_map = {}
for res in result:
    cam_id = res.get("camera_id")
    res_map.setdefault(cam_id, []).append(res)

# 2. 构建data_source id到对应camera_id的映射
ds_to_cam_id = {ds.get("id"): ds.get("parent_id") for ds in data_source_ids}

步骤2:简化循环逻辑

完成索引构建后,原四层嵌套可直接简化为两层循环,性能提升非常明显:

for breakdown in data_breakdown:
    # 快速匹配对应的camera_id
    cam_id = ds_to_cam_id.get(breakdown.get("parent_id"))
    # 无匹配直接跳过,减少无效判断
    if cam_id not in res_map:
        continue
    # 直接拿到所有匹配的res更新数据
    for res in res_map[cam_id]:
        res.get("data").update({breakdown.get("name"): breakdown.get("total")})

可选的简洁写法

如果你的Python版本 >=3.8,还可以用海象运算符进一步简化代码,注意不要为了压缩行数牺牲可读性:

for bd in data_breakdown:
    if (cam_id := ds_to_cam_id.get(bd.get("parent_id"))) in res_map:
        for res in res_map[cam_id]:
            # 确定所有字典存在对应key时可去掉get直接用下标取值,性能更高
            res["data"][bd["name"]] = bd["total"]

内容的提问来源于stack exchange,提问作者gabrielcon6

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:06:00