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

标签 python performance multiprocessing fuzzywuzzy

我是 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 限制问题。通过并行,您最多可以将其速度提高两倍(因为您有两个核心)。你真正应该做的是加快单线程性能。编辑距离相当慢,因此有很多机会加快速度。

  1. 使用修剪。如果无法给出良好的结果,请不要尝试在两个字符串之间运行完整的 fuzzywuzzy 匹配。尝试找到一种简单的线性算法来在 fuzzywuzzy 匹配之前过滤掉不相关的选择。
  2. 考虑建立索引。有什么方法可以索引您的列表吗?例如:如果您的匹配基于整个单词,请创建一个将单词映射到字符串的 HashMap 。仅尝试匹配与当前字符串至少有一个共同词的选项。
  3. 预处理。是否对每场比赛中的字符串进行了一些可以预处理的工作?例如,如果您的 Levenshtein 实现首先从字符串中创建集合,请考虑首先创建所有集合,这样您就不必在每场比赛中一遍又一遍地执行相同的工作。
  4. 有更好的算法可以使用吗?也许编辑距离并不是最好的算法。
  5. 您使用的 Levenshtein 距离的实现是否最佳?这又回到步骤 3(预处理)。您还可以采取其他措施来加快运行速度吗?

多处理只会以恒定因子加速(取决于核心数量)。索引可以带您进入较低复杂度的级别!因此,首先关注修剪和索引,然后执行步骤 3-5。只有当您从这些步骤中获得足够的成果时,您才应该考虑多重处理。

关于python - 如何在 python 中对运行 fuzzywuzzy 字符串匹配逻辑的 2m 行进行多重处理?当前的代码非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41571358/

相关文章:

python - 在Python多处理模块中使用Pool和Queue

python - 如何对装饰函数进行单元测试?

python - 将多个值绘制为范围 - matplotlib

c# - ILogger _logger.Debug ("Something") - 编译器有什么方法可以删除它?

c++ - 如果我的进程在事件之间处于空闲状态,为什么延迟会更大?

Python 使用多个处理器

python - 如何使用轮盘赌选择 parent ?

python - 用 cv2 叠加两个图像结果作为噪声

java - ArrayList.clear() 与 ArrayList=null

python - 跟踪 Python 中的内存泄漏(多处理)