Vì bạn đang xử lý từng từ với mystring
, chắc chắn bạn có thể sử dụng tính năng bí ẩn làm bộ. Sau đó chỉ cần lấy ngã tư giữa các thiết lập có chứa các từ trong mystring
và các nhóm đối tượng của chữ:
In [370]: mystring=set(['foobar','barfoo','foo'])
In [371]: mystring.intersection(set(['foo', 'bar', 'hello']))
Out[371]: set(['foo'])
của bạn logic 'hoặc' là các thành viên của giao điểm của hai bộ.
Sử dụng bộ cũng nhanh hơn. Dưới đây là thời gian tương đối vs một máy phát điện và biểu thức chính quy:
f1: generator to test against large string
f2: re to test against large string
f3: set intersection of two sets of words
rate/sec f2 f1 f3
f2 101,333 -- -95.0% -95.5%
f1 2,026,329 1899.7% -- -10.1%
f3 2,253,539 2123.9% 11.2% --
Vì vậy, một máy phát điện và các in
hoạt động là 19x nhanh hơn so với một biểu thức chính quy và một ngã tư bộ là 21x nhanh hơn so với một regex và nhanh hơn so với một máy phát điện 11%.
Đây là mã đã tạo ra thời gian:
import re
with open('/usr/share/dict/words','r') as fin:
set_words={word.strip() for word in fin}
s_words=' '.join(set_words)
target=set(['bar','foo','hello'])
target_re = re.compile("(%s)" % ("|".join(re.escape(word) for word in target),))
gen_target=(word for word in ('bar','foo','hello'))
def f1():
""" generator to test against large string """
if any(s in s_words for s in gen_target):
return True
def f2():
""" re to test against large string """
if re.search(target_re, s_words):
return True
def f3():
""" set intersection of two sets of words """
if target.intersection(set_words):
return True
funcs=[f1,f2,f3]
legend(funcs)
cmpthese(funcs)
Nguồn
2012-06-25 13:49:43
Cảm ơn. Nhưng kỹ thuật đó không ngăn cản tối ưu hóa mạch ngắn? – ereOn
Đó là máy phát điện, không phải danh sách. – johv
Không. '(s trong mystring cho s trong 'foo', 'bar', 'hello')' là một biểu thức máy phát điện, có nghĩa là nó không được tính ngay lập tức như một toàn thể, chỉ theo yêu cầu. 'any()' dừng lặp lại khi nhìn thấy giá trị thực đầu tiên, vì vậy phần còn lại sẽ không bao giờ được kiểm tra. Đọc trên biểu thức máy phát. – Kos