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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:25:38