Избегайте использования оператора IF после выполнения условия

У меня есть операция деления внутри цикла, который повторяется много раз. Бывает так, что в первых нескольких проходах цикла (примерно первые 10 циклов) делитель равен нулю. Как только он набирает значение, ошибка деления на ноль больше невозможна.

У меня есть условие if для проверки значения делителя, чтобы избежать div на ноль, но мне интересно, что есть влияние на производительность, которое оценка этого if будет иметь для каждого запуска в последующих циклах, тем более что я знаю, что это бесполезно больше.

Как это следует закодировать? в Python?


person greye    schedule 26.03.2010    source источник
comment
Если вам нужно задаться вопросом, влияет ли это на производительность, то, скорее всего, нет никакого влияния на производительность. Не тратьте время на ожидание проблем с производительностью, которых вы не видели и не измеряли в реальных условиях.   -  person Tadeusz A. Kadłubowski    schedule 26.03.2010


Ответы (3)


Я бы обернул ваш звонок в блоки try / except. Они очень дешевы в python и стоят примерно столько же, сколько инструкция pass, если исключение не сгенерировано. Python разработан таким образом, что вы должны совершать звонки и анализировать любые ошибки, а не всегда спрашивать разрешения.

Пример кода:

def print_divide(x,y):
    try:
        print x/y
    except ZeroDivisionError:
        pass
person Kyle    schedule 26.03.2010
comment
+1: Использование механизма try: except означает, что вы не обременены оценкой if для каждой итерации, хотя цикл после начальных 10 или около того, где делитель равен 0. - person ; 26.03.2010
comment
Я считаю, что исключения следует делать на случай непредвиденных обстоятельств. Запустить ошибку ZeroDivisionError с открытыми глазами, когда вы знаете, что делитель будет равен 0 на первых двух итерациях, кажется странным. Кроме того, действительно ли вариант try / except дешевле простого if? - person Thilo; 26.03.2010
comment
Re: попробуйте / except действительно дешевле простого if. По-видимому, это: stackoverflow.com/questions/ 2522005 / - person Thilo; 26.03.2010

Не волнуйся. if (a != 0) дешевый.

Альтернативой (если вы действительно этого хотите) может быть разделение цикла на два и выход из первого, как только делитель получит свое значение. Но похоже, что это сделает код излишне сложным (трудным для чтения).

person Thilo    schedule 26.03.2010
comment
+1: возможны варианты, но все они сделают код менее читабельным. Я бы подумал о переходе на них только после того, как профилировщик указал на этот цикл как на одно из основных ударов по глобальной производительности. - person rob; 26.03.2010

Я с Тило: я думаю, это должно быть довольно дешево.

Если вам действительно не все равно, вам следует рассчитать код и выяснить, неприемлемы ли небольшие накладные расходы. Я подозреваю, что нет.

person George V. Reilly    schedule 26.03.2010
comment
это скорее комментарий, чем ответ? - person joel; 13.08.2019