我不認爲正則表達式是要走的路。即使當我在循環外部指定joined = '~'.join(lst) + '~'
時,q+'~' in joined
優於re.search(q + '~', joined)
(0.00093秒比0.0034秒)。
但是,假設您不會有連接的字符串,不需要它的方法可能會更快。生成器可能很有用,因爲它只會在您需要時生成值(所以只要您在一個項目的末尾發現查詢,就可以停止,而不是檢查列表的其餘部分)。
這是最快的了我:any(k for k in lst if k.endswith(q))
我的代碼:
import timeit
setup = '''
import string
import random
import re
lst = []
for i in range(10000):
lst.append(random.choice(string.letters)+random.choice(string.letters)+random.choice(string.letters)+random.choice(string.letters))
q = 'ab'
'''
print "reference: "
print round(min(timeit.Timer("q in lst", setup=setup).repeat(7,500)),5)
# 0.05435
print "\nreference with joined string: "
print round(min(timeit.Timer("q+'~' in '~'.join(lst) + '~'", setup=setup).repeat(7,500)),5)
# 0.05462
print "\nendswith, with list approach: "
print round(min(timeit.Timer("any([k for k in lst if k.endswith(q)])", setup=setup).repeat(7,500)),5)
# 0.62998
print "\nfind method: "
print round(min(timeit.Timer("[k for k in lst if k.find(q, len(k)-len(q))]", setup=setup).repeat(7,500)),5)
# 1.22274
print "\nregex: "
print round(min(timeit.Timer("[k for k in lst if re.search(q + '$', k)]", setup=setup).repeat(7,500)),5)
# 3.73494
print "\nregex without list comprehension: "
print round(min(timeit.Timer("re.search(q + '~', '~'.join(lst) + '~')", setup=setup).repeat(7,500)),5)
# 0.05435
print "\nendswith, with generator approach: "
print round(min(timeit.Timer("any((k for k in lst if k.endswith(q)))", setup=setup).repeat(7,500)),5)
# 0.02052
是否只想找到,如果在'lst'任何物品與'q'結束,或者你需要一個列表以'q'結尾的項目? – Greg
只是爲了找到是否有這樣的項目 - 真/假 – vedar
在正則表達式搜索中的'''.join(lst)'可以在循環外部分配,這給正則表達式搜索3倍提升,在這種類型的搜索中使用循環。 – vedar