高效提取共享ID的两个实例列表中目标元素的算法问询
优化跨列表匹配ID的算法,提升大数据量下的性能
这问题我太熟了!你当前的实现之所以在数据量大的时候跑得慢,核心原因是列表的in操作是线性遍历——每次检查line.ID in IDs_listB都要把IDs_listB从头到尾扫一遍,时间复杂度直接拉到O(N*M),数据量上去后肯定卡得不行。
最优解决方案:用集合(Set)替代列表存储ID
集合的成员查询平均时间复杂度是O(1),把listB的ID转成集合后,整体时间复杂度会降到O(N+M)(M是转集合的时间,N是遍历listA的时间),性能提升非常明显。
修改后的代码如下:
# 把listB的ID转成集合,O(M)时间 id_set_b = {instance.ID for instance in listB} out_tab = [] # 遍历listA,每次查询都是O(1),整体O(N)时间 for instance_a in listA: if instance_a.ID in id_set_b: out_tab.append(instance_a)
额外优化:用列表推导式简化代码
如果代码风格允许,还可以用列表推导式把遍历和筛选一步完成,更简洁:
id_set_b = {instance.ID for instance in listB} out_tab = [instance_a for instance_a in listA if instance_a.ID in id_set_b]
补充说明
- 如果listB里存在重复的ID,转成集合会自动去重,但这不影响结果——我们只需要判断ID是否存在,重复ID不影响匹配逻辑。
- 要是之后需要关联ClassB的其他属性(比如之后ClassB加了新字段),可以把集合换成字典(
{instance.ID: instance for instance in listB}),这样既能快速查询,又能直接拿到对应的ClassB实例。
内容的提问来源于stack exchange,提问作者boat
相关产品推荐
相关产品推荐

