Подтвердить что ты не робот

Является ли обработка исключений python более эффективной, чем PHP и/или другие языки?

У меня это пробурено в голову, что (по крайней мере, на PHP) это badbadmojo для использования блоков try... catch для управления потоком. То, что я узнал, это использовать их только для обработки неожиданных ошибок, а не для определения логического потока программы, потому что catch блоки дороги.

Теперь, когда я изучаю python, я вижу множество исключений во всем мире и EAFP. Означает ли это, что python более эффективен при обработке исключений, поэтому мне не нужно так беспокоиться о них для управления потоком, или этот принцип все еще стоит? Если нет, является ли PHP исключением из нормы (по сравнению с другими языками) или является Python?

4b9b3361

Ответ 1

Исторически, в таких языках, как С++, исключения были очень медленными по сравнению с другими формами управления потоком на одном языке.

В С++ работают две вещи:

  • Выбрасывание исключения очень сложно. Стек должен быть размотан, и это делается в собственном коде намного сложнее, чем на высокоуровневом языке на основе VM.
  • Регулярное, прямое управление потоком очень быстрое. Это собственный код; ветвь - это пара инструкций, в которых исключение, отбрасывающее стек, вызывает сложный алгоритм (поиск данных стека в большой, возможно сжатой таблице и т.д.).

Это несоответствие производительности привело к общей мудрости за исключениями: делайте это только для необычных вещей, поэтому она используется только там, где она наиболее выгодна, а не там, где это может повредить производительность.

Это не относится к языкам высокого уровня. Это также по двум причинам:

  • Откат стопки намного проще. Стек очень легко изучить; вам не нужны волшебные таблицы, чтобы знать, как далеко отбросить стек и какие объекты будут построены в любой момент времени.
  • Поток обычной программы по своей сути медленнее. На языке, основанном на виртуальной машине, все просто требует больше усилий для начала.

Исключения все еще не являются бесплатными, но несоответствие уже не является чем-то, о чем можно так беспокоиться. Это означает, что общая мудрость, сформированная на С++, здесь неверна. Исключения регулярно используются в нормальном потоке программы.

Фактически, они встроены в язык, в конструкции, которые вы используете все время. Каждый раз, когда вы используете итератор - каждый for x in xrange(1000), для завершения цикла используется исключение StopIteration.

Выбор исключений или управление линейным потоком в Python, на основе которого имеет смысл. Не выбирайте на основе производительности, если только вы не находитесь во внутреннем цикле, где важна производительность; в этом случае, как всегда, профиль и выяснить, действительно ли это имеет значение.

(Я не могу говорить для PHP.)

Ответ 2

Я не считаю, что EAFP поощряет использование исключений для контроля потока. Скорее, он говорит нам, что нам не нужно проверять наличие определенного ключа в словаре или свойстве объекта, прежде чем мы его ссылаемся.

Выбрасывание исключений в качестве альтернативы операторам if или корректным операторам while или вместо использования break или continue внутри цикла не относится к этой категории. Эта ленивая, подверженная ошибкам прогамминга, и ее следует избегать.

Ответ 4

Чтобы ответить на вопрос: Да. Исключения на Python дешевы. Если тест по-прежнему дешевле, да, вы должны просто использовать исключения для "неожиданных" ситуаций, так как если бы вы ожидали, что код будет терпеть неудачу чаще всего, проверьте, прежде чем вы это сделаете. Поскольку if-check будет избегать также фактической попытки, а также повышения и улавливания исключения, это будет намного быстрее в ситуации, которая терпит неудачу. (Если, конечно, сам тест не стоит дорого).

Но нет смысла избегать исключений как таковых. Python не будет перетаскиваться в обход, потому что вы поймаете множество исключений.

И как обычно: оптимизация без профилирования преждевременна.

Ответ 5

Здесь есть специальное исключение, которое предполагается использовать только в обычном потоке выполнения: StopIteration. Это означает, что создатель Python не считает, что накладные расходы исключений не соответствуют.

Является ли это тем, что обработка исключений uber-эффективна, или остальная часть языка просто медленна путем сравнения - это еще один вопрос...

Ответ 6

Я сделал немного больше чтения и осознал еще одну важную вещь, о которой никто еще не упомянул: в Python нет различий между ошибками и исключениями. Я знал это, но я не думаю, что до сих пор понял это значение.

В PHP вы можете обернуть $page->GetContent(); в try...catch блокировать все, что хотите, но если $page не является объектом, ваше приложение все равно придет к остановке с визгом с вызванной фатальной ошибкой. Поэтому в PHP (и на любом другом языке, где ошибки не могут быть обнаружены), вам нужен определенный уровень LBYL.

Python в основном говорит: "Это глупо, я должен уловить их". Просто попробуйте сделать то, что вам нужно, и обработайте любые выпадения в блоке except.

Вот отличная статья об обработке исключений. Я столкнулся.