您可以通過將關鍵字列表構建爲正則表達式來改善問題。
這可能允許它們並行測試,但很大程度上取決於關鍵字是什麼(例如,某些工作可能會重複使用測試「hello」和「hell」,而不是從一開始就搜索每個短語對於
每個單詞你可以通過執行此操作:
import re
keyword_re = re.compile("|".join(map(re.escape, keywords)))
然後:
>>> bool(keyword_re.search('hello, world'))
True
>>> bool(keyword_re.search('hi, earth'))
False
(實際上,它將在找到返回匹配對象,無如果沒有找到 - 這可能是有用的,如果你需要知道哪個關鍵字匹配)
但是,多少(如果有的話),這取決於你的關鍵字。如果您只有一兩個,請保持目前的方法。如果你有一個大的列表,可能需要花時間和分析來看看哪個更好。
[編輯] 作爲參考,這裏的方法爲你的榜樣怎麼辦:
good1 good2 good3 bad1 bad2
original : 0.206 0.233 0.229 0.390 63.879
gnud (join) : 0.257 0.347 4.600 0.281 6.706
regex : 0.766 1.018 0.397 0.764 124.351
regex (join) : 0.345 0.337 3.305 0.481 48.666
顯然,對於這種情況下,你的方法執行遠遠超過了正則表達式的好。這種情況是否會一直如此,取決於關鍵字的數量和複雜程度以及將要檢查的輸入數據。對於大量的關鍵字,冗長的列表或很少匹配的短語,正則表達式可能會更好,但做可以獲得計時信息,並且可能會嘗試更簡單的優化(如將最常見的詞移到關鍵字列表的前面)。有時候最簡單的方法確實是最好的。
[編輯]在應用正則表達式之前用gnud's solution和類似的方法更新了表格。我還添加了2個新的測試:
good_data3 = good_data2 * 500 # 1000 items, the first of which matches.
bad_data2 = bad_data * 500 # 1000 items, none of which matches.
其中顯示了各種優勢和劣勢。如果立即找到匹配,聯接確實會變得更糟(因爲加入列表時始終支付預付費用 - 這對於線性搜索方法來說是最好的情況),但對於不匹配的列表,它會執行更好。 很多更好,當list.case中有大量的項目時)。
雖然它更緊湊,但它的可讀性要低得多。非常好的恕我直言。 – 2009-04-14 21:09:19
+1,因爲它是標準的pythonista成語 – dwc 2009-04-14 21:13:43
+1這是非常pythonic和乾淨的關鍵字小列表 – 2009-04-14 23:25:02