for
循環在執行時間上相當昂貴。我正在構建一個修正算法,並且使用了peter norvig的拼寫修正代碼。我對其進行了一些修改,並意識到執行數千字優化所花費的時間太長。加速執行,Python
該算法檢查1和2編輯距離並糾正它。我已經做到了3。所以這可能會增加時間(我不確定)。這裏是最高的出現的單詞作爲參考結束的一部分:
def correct(word):
candidates = (known([word]).union(known(edits1(word)))).union(known_edits2(word).union(known_edits3(word)) or [word]) # this is where the problem is
candidate_new = []
for candidate in candidates: #this statement isnt the problem
if soundex(candidate) == soundex(word):
candidate_new.append(candidate)
return max(candidate_new, key=(NWORDS.get))
它看起來像語句0增加了執行時間。你可以很容易地看看彼得諾維格的代碼,點擊here。
我已經找到了問題。它在聲明中
candidates = (known([word]).union(known(edits1(word)))
).union(known_edits2(word).union(known_edits3(word)) or [word])
其中,
def known_edits3(word):
return set(e3 for e1 in edits1(word) for e2 in edits1(e1)
for e3 in edits1(e2) if e3 in NWORDS)
可以看出,有3內edits3
循環增加執行時間3倍。 edits2
有2個for循環。所以這是罪魁禍首。
如何最小化此表達式? 可以幫助itertools.repeat
這個?
與*相比增加執行時間* –
先嚐試列表理解,看看是否改善了事情:'候選人候選人=候選人候選人如果soundex(候選人)== soundex(單詞)]' – Evert
@Evert我很好奇,但爲什麼會列表理解有什麼可衡量的影響? –