Tại sao bạn không đo lường nó bằng cách sử dụng timeit
mô-đun ? Bằng cách đó, bạn có thể xem liệu nó có liên quan đến ứng dụng của bạn hay không.
OK, vì vậy tôi vừa thử những cách sau:
import timeit
statements=["""\
try:
b = 10/a
except ZeroDivisionError:
pass""",
"""\
if a:
b = 10/a""",
"b = 10/a"]
for a in (1,0):
for s in statements:
t = timeit.Timer(stmt=s, setup='a={}'.format(a))
print("a = {}\n{}".format(a,s))
print("%.2f usec/pass\n" % (1000000 * t.timeit(number=100000)/100000))
Kết quả:
a = 1
try:
b = 10/a
except ZeroDivisionError:
pass
0.25 usec/pass
a = 1
if a:
b = 10/a
0.29 usec/pass
a = 1
b = 10/a
0.22 usec/pass
a = 0
try:
b = 10/a
except ZeroDivisionError:
pass
0.57 usec/pass
a = 0
if a:
b = 10/a
0.04 usec/pass
a = 0
b = 10/a
ZeroDivisionError: int division or modulo by zero
Vì vậy, như mong đợi, việc không có bất kỳ trình xử lý ngoại lệ nào sẽ nhanh hơn một chút (nhưng sẽ thổi phồng mặt bạn khi ngoại lệ xảy ra), và try/except
nhanh hơn một cách rõ ràng if
miễn là điều kiện không được đáp ứng.
Nhưng tất cả đều nằm trong cùng một thứ tự độ lớn và không có vấn đề gì cả. Chỉ khi điều kiện thực sự được đáp ứng, thì if
phiên bản mới nhanh hơn đáng kể.