Dlaczego nie zmierzyć go za pomocą ? W ten sposób możesz sprawdzić, czy jest on odpowiedni dla twojej aplikacji.
OK, więc ja tylko próbowałem następujące:
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))
Wynik:
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
Tak, jak oczekiwano, nie mając żadnej obsługi wyjątku jest nieco szybciej (ale wysadza w swojej twarz, gdy wystąpi wyjątek) i try/except
jest szybszy niż jawny if
, o ile warunek nie jest spełniony.
Ale wszystko to w tym samym rzędzie wielkości i nie ma to znaczenia w żaden sposób. Tylko wtedy, gdy warunek jest rzeczywiście spełniony, wersja if
jest znacznie szybsza.
Kiedy to zmierzyłeś, czego się nauczyłeś? –
Powiązane pytanie: http://stackoverflow.com/questions/1835756/ – tzot
Użyj opcji try/except, chyba że szanse na to, że nastąpi kontrola, z wyjątkiem części, są mniejsze i jeśli/else, jeśli szanse są większe. – shadow0359