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
相关产品推荐
相关产品推荐

