2014-07-02 108 views
1

我有一個python 2.7腳本,通常運行幾個小時,我現在試圖優化它。它有很多關於字符串的搜索,這代表了計算的重要部分。目前我正在使用re.search('stringToFind', haystack)來查找更長字符串中的子字符串。我正在考慮重寫所有不包含正則表達式的表達式,並改用in。幾乎所有被搜索的字符串都是普通字符串,即不包含正則表達式。在與研究python

我知道in使用contains方法來檢查子字符串,但我不知道re.search如何爲非re的字符串工作。 re.search如何工作?在字符串比較中使用substring而不是re.search會更有效嗎?

編輯:爲了澄清我可以給當前運行的代碼的示例:

if re.search('extern', variable): 
    # Do something... 

可以通過以下方式更換:

if 'extern' in variable: 
    # Do something... 
+1

你是什麼意思'非重新串'?一個例子會更好。 –

+6

你的計時測試哪種方法更快? – timgeb

+0

我完全認爲'in'會更快。 –

回答

1

正如其他人的評論,在執行正則表達式搜索是固有地更比簡單的子字符串搜索複雜。這裏是一個非常粗略的基準:

import timeit 
import re 
s = '0' * 1000 + 'foo' + '0' * 1000 
rgx = re.compile(r'foo') 
setup = 'from __main__ import s, rgx' 
print timeit.timeit('"foo" in s', setup = setup)    # 0.745168924332 
print timeit.timeit('rgx.search(s).group(0)', setup = setup) # 1.14249396324 

但是,如果你的程序運行幾小時,我懷疑,問題的根源在於這些地區。

+0

但是,我認爲正則表達式的複雜性可以影響基準?你只是在這裏使用一個簡單的正則表達式。 – myildirim

+3

@myildirim正則表達式必須簡單;否則,一個簡單的子字符串搜索將不會是一個可行的選擇,OP的問題沒有任何意義 - 除非我誤解了這個問題。 – FMc

+0

我實際上並沒有使用真正的正則表達式,只是檢查正常字符串的出現。現在添加了一個更新顯示一些代碼。 – Pphoenix