Tôi có một chuỗi khá lớn (~ 700k) mà tôi cần chạy 10 regex và đếm tất cả các kết quả phù hợp của bất kỳ regex nào. Impl của tôi nhanh chóng và bẩn thỉu là để làm một cái gì đó như re.search ('(expr1) | (expr2) | ...'), nhưng tôi đã tự hỏi nếu chúng ta sẽ thấy bất kỳ lợi ích hiệu suất bằng cách kết hợp trong một vòng thay thế:regex '|' toán tử vs chạy riêng biệt cho mỗi biểu thức con
Nói cách khác, tôi muốn so sánh hiệu suất của:
def CountMatchesInBigstring(bigstring, my_regexes):
"""Counts how many of the expressions in my_regexes match bigstring."""
count = 0
combined_expr = '|'.join(['(%s)' % r for r in my_regexes])
matches = re.search(combined_expr, bigstring)
if matches:
count += NumMatches(matches)
return count
vs
def CountMatchesInBigstring(bigstring, my_regexes):
"""Counts how many of the expressions in my_regexes match bigstring."""
count = 0
for reg in my_regexes:
matches = re.search(reg, bigstring)
if matches:
count += NumMatches(matches)
return count
tôi sẽ dừng lại lười biếng và chạy một số xét nghiệm vào ngày mai (và gửi kết quả), nhưng tôi tự hỏi cho dù câu trả lời sẽ nhảy ra cho một người thực sự hiểu làm thế nào regexes làm việc :)
Vì mọi regex trong ví dụ của ông chỉ được sử dụng một lần, bạn sẽ không nhận được bất kỳ cải thiện hiệu suất nào bằng cách biên dịch trước. –
ngay cả khi bạn sử dụng từng regex nhiều lần, mô-đun tái của python đã lưu trữ các regex được biên dịch cho bạn, do đó, trong lần thứ hai trở đi, nó sẽ sử dụng phần mềm đã biên dịch trước. – nosklo