【问题标题】:Python For loop taking too much timePython For循环花费太多时间
【发布时间】:2021-09-27 09:19:08
【问题描述】:

我有两个不同的数据集,其中一个包含 650k 条记录,另一个包含 20k 条记录,我想在两个数据集的单列中查找匹配或近似匹配的数据。由于 Python 很慢,如何加快进程?

注意:我的数据类型在两个数据集的两列中都是字符串。

这是我的简单代码:

from fuzzywuzzy import fuzz

df1
df2
    
for i in df1['string1']:
   for j in df2['string2']:
      Ratio = fuzz.ratio(i.lower(),j.lower())
print(Ratio)

【问题讨论】:

  • 如果您需要将每个条目与其他每个条目进行比较,那么这是一项具有固定复杂性的任务,并且不能作为单个进程提高效率。您最好的选择是将df1 和df2 拆分为许多较小的集合,然后并行运行比较。 multiprocessing pool 可能是一个很好的起点。

标签: python-3.x for-loop


【解决方案1】:

您可能想用RapidFuzz(我是作者)替换您对 FuzzyWuzzy 的使用,这明显更快。 使用 RapidFuzz,您的算法可以通过以下方式实现:

import pandas as pd
from rapidfuzz import fuzz, process

def lower(str, **kwargs):
    return str.lower()

d = {'string1': ["abcd", "abcde"]*1000, 'string2': ["abcd", "abc"]*1000}
df = pd.DataFrame(data=d)
process.cdist(df["string1"], df["string2"],
    processor=lower, scorer=fuzz.ratio)

返回

array([[100,  86, 100, ...,  86, 100,  86],
       [ 89,  75,  89, ...,  75,  89,  75],
       [100,  86, 100, ...,  86, 100,  86],
       ...,
       [ 89,  75,  89, ...,  75,  89,  75],
       [100,  86, 100, ...,  86, 100,  86],
       [ 89,  75,  89, ...,  75,  89,  75]], dtype=uint8)

您可以使用多线程进一步提高性能:

process.cdist(df["string1"], df["string2"],
    processor=lower, scorer=fuzz.ratio, workers=-1)

如果您不想使用所有可用内核,您可以为 workers 指定不同的计数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2020-04-07
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2022-01-20
    相关资源
    最近更新 更多