Python For loop运行过慢,如何加速两数据集字符串模糊匹配流程?
字符串模糊匹配性能优化方案
原代码核心问题
你当前用的双重嵌套循环时间复杂度是O(M*N),对应65万*2万=130亿次匹配计算,再加上每次循环都重复做字符串转小写、纯Python实现的编辑距离计算,速度必然极慢。
优化方案
1. 前置预处理减少无效计算
- 提前统一把两列字符串转成小写,避免每次匹配重复转换
- 先筛选完全匹配的项,完全匹配的直接归类,无需走模糊匹配逻辑,可大幅减少后续计算量
2. 替换为高性能匹配库
放弃原生fuzzywuzzy,改用RapidFuzz:它是C++实现的模糊匹配库,性能是带Levenshtein加速的fuzzywuzzy的2~10倍,API和fuzzywuzzy完全兼容,直接替换即可。
安装命令:pip install rapidfuzz
3. 加入预过滤逻辑降低匹配量
用n-gram分块或者首字符分块规则:比如只有两个字符串前2个字符相同、或者3-gram重合度高于30%,才执行编辑距离计算,能筛掉90%以上无需比较的候选对。
4. 使用专用数据集链接工具
推荐用recordlinkage库,专门用于两个结构化数据集的关联匹配,内置分块、批量计算、并行加速能力,不用自己写循环。
优化后示例代码
import pandas as pd from rapidfuzz import fuzz import recordlinkage # 1. 预处理:统一转小写 df1['string1_lower'] = df1['string1'].str.lower() df2['string2_lower'] = df2['string2'].str.lower() # 2. 先提取完全匹配的项 exact_matches = df1.merge(df2, left_on='string1_lower', right_on='string2_lower') # 剩下的非完全匹配的项走模糊匹配 df1_remain = df1[~df1['string1_lower'].isin(df2['string2_lower'])].reset_index(drop=True) df2_remain = df2[~df2['string2_lower'].isin(df1['string1_lower'])].reset_index(drop=True) # 3. 用recordlinkage分块匹配,减少比较量 indexer = recordlinkage.Index() # 按前2个字符分块,仅同块内比较 indexer.block('string1_lower', 'string2_lower', block_length=2) candidate_pairs = indexer.index(df1_remain, df2_remain) # 4. 批量计算相似度 compare_cl = recordlinkage.Compare() compare_cl.string('string1_lower', 'string2_lower', method='levenshtein', threshold=80, label='match_score') matches = compare_cl.compute(candidate_pairs, df1_remain, df2_remain) # 最终匹配结果:完全匹配+模糊匹配 final_matches = pd.concat([exact_matches, matches.reset_index()])
额外加速技巧
- 如果数据量还可以更大,可开启
recordlinkage的并行计算参数,调用多核CPU资源 - 若对匹配精度要求不是极高,可把相似度阈值适当调高,减少输出匹配对的数量
内容的提问来源于stack exchange,提问作者swarna
相关产品推荐
相关产品推荐

