如何高效比较list_1元素是否存在于list_2对应索引的子列表?
高效判断对应索引元素是否存在于子列表的方法
我有两个规模极大的列表,需要多次执行以下逻辑:判断list_1中每个元素是否存在于list_2对应索引的子列表中。目前用for循环实现,但效率不足,希望找到更高效的实现方式,也可使用GPU加速。
示例数据:
list_1 = ['Denver Broncos', 'Carolina Panthers', "Levi's Stadium in the San Francisco Bay Area at Santa Clara, California", 'Carolina Panthers', 'gold'] list_2 = [['Denver Broncos', 'Denver Broncos', 'Denver Broncos'], ['Carolina Panthers', 'Carolina Panthers', 'Carolina Panthers'], ['Santa Clara, California', "Levi's Stadium", "Levi's Stadium in the San Francisco Bay Area at Santa Clara, California."], ['Denver Broncos', 'Denver Broncos', 'Denver Broncos'], ['gold', 'gold', 'gold']]
当前实现代码:
score = 0 for i in range(len(list_1)): if list_1[i] in list_2[i]: score += 1 average_score = score / len(list_1) # 原代码中predicted_answers为笔误,修正为list_1
优化方案
1. CPU端最优:预处理为集合
列表的in操作时间复杂度为O(k)(k是子列表长度),而集合的in操作是O(1)。先将list_2的每个子列表转为集合,能大幅降低单次判断的开销,尤其适合需要多次运行该逻辑的场景:
# 预处理list_2为集合列表(仅需执行一次,可重复使用) set_list_2 = [set(sublist) for sublist in list_2] # 用生成器表达式统计符合条件的元素数量 score = sum(item in sub_set for item, sub_set in zip(list_1, set_list_2)) average_score = score / len(list_1)
2. GPU加速:使用CuPy
若有GPU资源,可借助CuPy库将计算转移到GPU上,利用硬件并行提升效率:
首先安装对应CUDA版本的CuPy:
pip install cupy-cuda11x # 替换为你的CUDA版本,如cupy-cuda12x
实现代码:
import cupy as cp # 将数据转移到GPU cp_list_1 = cp.array(list_1) # 预处理子列表为GPU端的唯一值数组(去重后等价于集合) cp_unique_list_2 = [cp.unique(cp.array(sublist)) for sublist in list_2] # 统计符合条件的数量 score = 0 for item, arr in zip(cp_list_1, cp_unique_list_2): # 判断item是否在arr中,转换为Python整数累加到score score += cp.any(item == arr).item() average_score = score / len(cp_list_1)
3. CPU向量化:使用NumPy
如果已经在使用NumPy生态,可借助其向量化操作优化,不过提升幅度不如集合预处理:
import numpy as np # 预处理子列表为去重后的NumPy数组 np_unique_list_2 = [np.unique(np.array(sublist)) for sublist in list_2] # 用np.isin判断元素是否存在,统计总数 score = sum(np.isin(item, arr) for item, arr in zip(list_1, np_unique_list_2)) average_score = score / len(list_1)
内容的提问来源于stack exchange,提问作者Penguin
相关产品推荐
相关产品推荐

