2011-02-04 30 views
38

Đối với một tìm kiếm chuỗi tắt, là nó nhanh hơn để chỉ đơn giản là sử dụng str.find/rfind hơn để sử dụng re.match/tìm kiếm?Hoạt động nhanh hơn, re.match/search hoặc str.find là gì?

Đó là, đối với một chuỗi cho trước, s, tôi nên sử dụng:

if s.find('lookforme') > -1: 
    do something 

hoặc

if re.match('lookforme',s): 
    do something else 

?

+3

Đối với một lần tắt, tôi khá chắc chắn regex sẽ chậm hơn, vì phí phụ trội. –

+1

Bạn nên cẩn thận so sánh hai, vì chúng có chức năng khác nhau. Tìm kiếm toàn bộ chuỗi, trong khi đối sánh khớp với chỉ bắt đầu (nghĩa là nó có thể thoát sớm, tùy thuộc vào dữ liệu). Vì vậy, bạn đang so sánh táo và cam ở đó. –

Trả lời

91

Câu hỏi: câu trả lời nhanh nhất được trả lời bằng cách sử dụng timeit.

from timeit import timeit 
import re 

def find(string, text): 
    if string.find(text) > -1: 
     pass 

def re_find(string, text): 
    if re.match(text, string): 
     pass 

def best_find(string, text): 
    if text in string: 
     pass 

print timeit("find(string, text)", "from __main__ import find; string='lookforme'; text='look'") 
print timeit("re_find(string, text)", "from __main__ import re_find; string='lookforme'; text='look'") 
print timeit("best_find(string, text)", "from __main__ import best_find; string='lookforme'; text='look'") 

Đầu ra là:

0.441393852234 
2.12302494049 
0.251421928406 

Vì vậy, không chỉ bạn nên sử dụng các nhà điều hành in vì nó là dễ dàng hơn để đọc, nhưng vì nó là nhanh hơn cũng có.

+2

Tối ưu hóa vi mô ở mức tốt nhất để chọn dựa trên thời gian. Tuy nhiên, +1 vì bạn đã chỉ định trường hợp dễ đọc nhất ... – ircmaxell

+5

Bạn chắc chắn đã trả lời đúng câu hỏi, sukhbir. Đồng ý, mặc dù +1 cho dễ đọc và bạn đã chứng minh câu trả lời là "pythonic". –

+4

Rõ ràng bạn đã lãnh đạo ban giám khảo tự động bằng cách gọi một "best_find" ;-) –

14

Sử dụng này:

if 'lookforme' in s: 
    do something 

Regex cần phải được biên dịch đầu tiên, trong đó cho biết thêm một số chi phí. Tìm kiếm chuỗi bình thường của Python là anyways rất hiệu quả.

Nếu bạn tìm kiếm cùng một cụm từ rất nhiều hoặc khi bạn làm điều gì đó phức tạp hơn thì regex trở nên hữu ích hơn.

+4

+1 Đầu tiên là pythonic - sau đó, nếu hiệu suất trở thành một vấn đề, hãy khám phá các triển khai khác nhau để xem liệu chúng có cải thiện hiệu suất hay không. –

7

re.compile tăng tốc độ regex rất nhiều nếu bạn đang tìm kiếm cùng một thứ lặp đi lặp lại. Nhưng tôi chỉ có một sự tăng tốc rất lớn bằng cách sử dụng "in" để loại bỏ các trường hợp xấu trước khi tôi kết hợp. Giai thoại, tôi biết. ~ Ben

2

Tôi đã gặp sự cố tương tự. Tôi sử dụng% timeit Jupyter để kiểm tra:

import re 
sent = "a sentence for measuring a find function" 
sent_list = sent.split() 
print("x in sentence") 
%timeit "function" in sent 
print("x in token list") 
%timeit "function" in sent_list 

print("regex search") 
%timeit bool(re.match(".*function.*", sent)) 
print("compiled regex search") 
regex = re.compile(".*function.*") 
%timeit bool(regex.match(sent)) 

x trong câu 61,3 ns ± 3 ns mỗi vòng lặp (.. Có nghĩa là ± dev std 7 chạy, 10000000 vòng mỗi)

x trong danh sách thẻ 93,3 ns ± 1,26 ns mỗi vòng lặp (trung bình ± dev std.. 7 chạy, 10000000 vòng mỗi)

regex tìm kiếm 772 ns ± 8,42 ns mỗi vòng lặp (trung bình ± dev std.. 7 chạy, 1000000 vòng mỗi)

tìm kiếm regex được biên dịch 420 ns ± 7,68 ns trên mỗi vòng lặp (trung bình ± std. Trong số 7 lần chạy, 1000000 vòng lặp)

Biên dịch nhanh nhưng đơn giản là tốt hơn.

Các vấn đề liên quan