如何使用Python多线程实现字典值的列表两两交集计算?
用Python多线程优化字典键值两两交集计算
问题场景
需要对字典中所有有序键对(如(1,2)、(2,1)这类反向对均需处理)计算对应值列表的交集,原串行实现方式在数据量较大时耗时过长,希望通过多线程并行处理优化性能。
原串行实现代码
myDict = {} myDict[1] = [1,2,3,4,5] myDict[2] = [2,3,4] myDict[3] = [1,2,5] myDict[4] = [4,5,6,7] finalDict = {} for i in myDict.keys(): similar_words = [] for j in myDict.keys(): if i ==j: continue else: temp = list(set(myDict[i]) & set(myDict[j])) similar_words.append([j, temp]) finalDict[i] = similar_words print(finalDict)
原代码运行结果
{1: [[2, [2, 3, 4]], [3, [1, 2, 5]], [4, [4, 5]]], 2: [[1, [2, 3, 4]], [3, [2]], [4, [4]]], 3: [[1, [1, 2, 5]], [2, [2]], [4, [5]]], 4: [[1, [4, 5]], [2, [4]], [3, [5]]]}
多线程优化方案
使用Python标准库concurrent.futures.ThreadPoolExecutor实现并行处理,同时提前将列表转为集合减少重复计算,具体步骤如下:
优化后代码
from concurrent.futures import ThreadPoolExecutor # 提前将列表转为集合,避免每次计算交集重复转换 myDict = { 1: {1, 2, 3, 4, 5}, 2: {2, 3, 4}, 3: {1, 2, 5}, 4: {4, 5, 6, 7} } def process_single_key(target_key, data_dict): """处理单个键,计算其与所有其他键的交集""" similar_pairs = [] for key in data_dict.keys(): if target_key == key: continue # 直接用集合求交集再转列表 intersection = list(data_dict[target_key] & data_dict[key]) similar_pairs.append([key, intersection]) return (target_key, similar_pairs) finalDict = {} # 创建线程池并行处理所有键 with ThreadPoolExecutor() as executor: # 提交所有键的处理任务 task_futures = [executor.submit(process_single_key, k, myDict) for k in myDict.keys()] # 逐个获取任务结果并构建最终字典 for future in task_futures: key, result = future.result() finalDict[key] = result print(finalDict)
关键优化点说明
- 提前转集合:原代码中每次计算交集都要将列表转为集合,属于重复操作,提前转换可大幅减少计算开销。
- 线程池管理:
ThreadPoolExecutor自动处理线程的创建、调度和销毁,无需手动管理线程生命周期,对新手友好。每个键的处理任务完全独立,不会出现资源竞争问题。 - 并行执行:将每个键的遍历计算任务分配到不同线程并行处理,在数据量较大时能有效缩短总耗时。
额外提示
如果你的场景属于纯CPU密集型计算(字典规模极大、集合元素数量众多),Python的GIL(全局解释器锁)会限制多线程的性能提升,此时可以考虑改用concurrent.futures.ProcessPoolExecutor(多进程)来实现并行,用法与上述多线程代码基本一致,只需替换线程池类即可。
内容的提问来源于stack exchange,提问作者Orca
相关产品推荐
相关产品推荐

