簡體   English   中英

減少 python 中嵌套循環的時間復雜度

[英]reduce time-complexity of nested loop in python

這是我的代碼。 需要 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))

我嘗試了不同的但沒有工作((。

dataset1 - 10krows,dataset2 - 1M 行,fuzz.token_sort_ratio(x,y) - 是一個 function,它采用 2 個參數(2 個字符串)並輸出 integer - 這兩個字符串的相似性

由於 dataframe 在這里沒有真正使用,我將簡單地使用以下兩個列表:

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM