减少python中嵌套循环的时间复杂度

时间:2020-04-29 07:26:12

标签: python time-complexity

这是我的代码。它需要17个小时才能完成。能否请您建议其他替代代码以减少计算时间?

# test algorithm1 - fuzzy
matched_pair = []
for x in dataset1['full_name_eng']:
    for y in dataset2['name']:
        if (fuzz.token_sort_ratio(x,y) > 85):
            matched_pair.append((x,y))
            print((x,y))

我尝试了不同的方法,但是没有用((。

数据集1-10行, 数据集2-1M行, fuzz.token_sort_ratio(x,y)-是一个使用2个参数(2个字符串)并输出整数的函数-这2个字符串的相似性

1 个答案:

答案 0 :(得分:1)

由于此处未真正使用数据框,因此我将仅处理以下两个列表:

import string
import random

random.seed(18)
dataset1 = [''.join(random.choice(string.ascii_lowercase + ' ') for _ in range(random.randint(13, 20))) for s in range(1000)]
dataset2 = [''.join(random.choice(string.ascii_lowercase + ' ') for _ in range(random.randint(13, 20))) for s in range(1000)]

将这两个列表与您使用Fuzzywuzzy提供的代码一起使用。作为第一个更改,您可以使用RapidFuzz(我是作者),该操作基本上与FuzzyWuzzy相同,但是速度要快得多。使用我的测试列表时,这大约是您代码的7倍。另一个问题是,在使用fuzz.token_sort_ratio时,字符串始终是小写的,例如标点符号已删除。虽然这使字符串匹配变得有意义,但是您对列表中的每个字符串都做了多次,这在使用较大的列表时会加起来。在这些列表中,仅使用RapidFuzz和仅进行一次预处理的速度约为这些列表的14倍。

from rapidfuzz import fuzz, utils

dataset2_processed = [utils.default_process(x) for x in dataset2]
dataset1_processed = [utils.default_process(x) for x in dataset1]

matched_pair = []
for word1, word1_processed in zip(dataset1, dataset1_processed):
    for word2, word2_processed in zip(dataset2, dataset2_processed):
        if fuzz.token_sort_ratio(word1_processed, word2_processed, processor=None, score_cutoff=85):
            matched_pair.append((word1, word2))