W innym pytaniu przyjęta odpowiedź sugerowała zastąpienie (bardzo tanie) wyrażenia if w kodzie Pythona blokiem try / except, aby poprawić wydajność.
Pomijając kwestie związane ze stylem kodowania, a zakładając, że wyjątek nigdy nie jest wyzwalany, jaką różnicę (pod względem wydajności) robi posiadanie programu obsługi wyjątków w porównaniu z brakiem go w porównaniu z instrukcją if-porównania z zerową wartością?
Odpowiedzi:
Dlaczego nie zmierzysz tego za pomocą
timeit
modułu ? W ten sposób możesz sprawdzić, czy jest to istotne dla Twojej aplikacji.OK, więc właśnie spróbowałem następujących rzeczy:
Wynik:
Tak więc, zgodnie z oczekiwaniami, brak obsługi wyjątków jest nieco szybszy (ale wybucha ci w twarz, gdy zdarza się wyjątek) i
try/except
jest szybszy niż jawny,if
o ile warunek nie jest spełniony.Ale wszystko jest w tym samym rzędzie wielkości i jest mało prawdopodobne, aby miało to znaczenie. Tylko jeśli warunek jest rzeczywiście spełniony,
if
wersja jest znacznie szybsza.źródło
try/except
jest szybszy niżif a != 0
Odpowiedź na to pytanie znajduje się w często zadawanych pytaniach dotyczących projektowania i historii :
źródło
To pytanie jest mylące. Jeśli założysz, że wyjątek nigdy nie jest wyzwalany, żaden z nich nie jest optymalnym kodem.
Jeśli założysz, że wyjątek jest wyzwalany jako część warunku błędu, jesteś już poza obszarem poszukiwania optymalnego kodu (i prawdopodobnie i tak nie obsługujesz go na tak drobnoziarnistym poziomie).
Jeśli używasz wyjątku jako części standardowego przepływu sterowania - który jest sposobem Pythona „poproś o wybaczenie, nie o pozwolenie” - wtedy wyjątek zostanie wyzwolony, a koszt zależy od jego rodzaju, rodzaju i szacowany procent czasu wystąpienia wyjątku.
źródło