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

如何最小化Python中万级字典列表双层匹配循环的执行时间

嵌套循环数据匹配逻辑的性能优化方案

原实现的性能根因

当前双层嵌套循环的时间复杂度为O(n*m),对应19000条fielding记录、17000条player记录的规模,单次执行需要完成近3.23亿次id相等判断,无意义的重复全量遍历是耗时过高的核心原因。

优化实现思路

借助Python集合哈希查找平均O(1)的时间复杂度,将两次嵌套遍历替换为两次独立的单次遍历,整体时间复杂度可降低至O(n+m),运行效率会实现两个数量级左右的提升。

优化后代码(保持原方案原地修改字典的行为)

# 单次遍历fielding列表,提取所有id存入集合
fielding_valid_ids = {entry['id'] for entry in fielding}
# 单次遍历player列表,命中id集合的记录直接更新name字段
for entry in player:
    if entry['id'] in fielding_valid_ids:
        entry['name'] = 'Luke'

行为说明

  • 上述代码和原逻辑的最终执行效果完全一致:遍历到所有同时存在于fielding和player列表中的相同id记录时,将player对应记录的name字段原地修改为Luke
  • 即使fielding列表中存在重复的id记录,集合存储会自动去重,不会造成player字段的无意义重复赋值
  • 因为集合的查找性能远高于列表的线性遍历,万级数据规模下,优化后的代码运行耗时会从原方案的数十秒级降到毫秒级,性能提升明显

可选写法(重新生成列表的场景)

如果业务场景允许直接替换原player列表而非原地修改字典,可以用推导式简化代码,性能和上述实现完全一致:

fielding_valid_ids = {entry['id'] for entry in fielding}
player = [
    {**entry, 'name': 'Luke'} if entry['id'] in fielding_valid_ids else entry
    for entry in player
]

注意:该写法会生成全新的字典与列表,若其他代码引用了原player列表中的旧字典对象,会无法感知字段更新,需要按实际业务依赖关系选择实现方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 03:15:03