如何在python中对运行fuzzywuzzy字符串匹配逻辑的2m行执行多处理?当前代码非常慢



我是python的新手,我正在一个包含200万条记录的列表上运行一个匹配逻辑的fuzzywuzzy字符串。代码正在运行,它也在提供输出。问题是它非常慢。在3小时内,它只处理80行。我想通过让它同时处理多行来加快速度

如果它有帮助的话——我正在我的机器上运行它,它有16Gb RAM和1.9 GHz双核CPU。

下面是我正在运行的代码。

d = []
n = len(Africa_Company) #original list with 2m string records
for i in range(1,n):
choices = Africa_Company[i+1:n]
word = Africa_Company[i]
try:
output= process.extractOne(str(word), str(choices), score_cutoff=85)
except Exception:
print (word) #to identify which string is throwing an exception
print (i) #to know how many rows are processed, can do without this also
if output:
d.append({'Company':Africa_Company[i], 
'NewCompany':output[0],
'Score':output[1], 
'Region':'Africa'})
else:
d.append({'Company':Africa_Company[i], 
'NewCompany':None,
'Score':None, 
'Region':'Africa'})

Africa_Corrected = pd.DataFrame(d) #output data in a pandas dataframe

提前感谢!

这是一个CPU绑定问题。通过并行,你最多可以将速度提高2倍(因为你有两个核心)。您真正应该做的是加快单线程性能。Levenstein的距离很慢,所以有很多机会加快速度。

  1. 使用修剪。如果不可能给出好的结果,就不要试图在两个字符串之间运行完全模糊的匹配。在模糊匹配之前,试着找到一个简单的线性算法来过滤掉不相关的选择
  2. 考虑索引。有什么方法可以为你的列表编制索引吗?例如:如果您的匹配是基于完整单词的,那么创建一个将单词映射到字符串的hashmap。只尝试与至少有一个单词与当前字符串相同的选项进行匹配
  3. 预处理。是否对每个匹配中的字符串都进行了一些预处理?例如,如果您的Levenstein实现是从字符串中创建集合开始的,请考虑先创建所有集合,这样您就不必在每次匹配中一遍又一遍地做同样的工作
  4. 有什么更好的算法可以使用吗?也许Levenstein距离不是最好的算法
  5. 你使用的Levenstein距离的实现是最优的吗?这将返回到步骤3(预处理)。您还可以做其他事情来加快运行时间吗

多处理器只会在一个恒定的因子(取决于内核的数量)下加速。索引可以让你进入一个复杂度较低的类!因此,首先关注修剪和索引,然后是步骤3-5。只有当您从这些步骤中挤出足够多的内容时,才应该考虑多处理。

最新更新