В целом, ускоряет ли замена AND парой вложенных IF? - PullRequest
3 голосов
/ 30 ноября 2010

Я взвешиваю разницу между

If[condition1 AND condition2, A, B]

и

If[condition1, If[condition2, A, B], B]

Мое мышление: вложенные IF будут быстрее.

Мое рассуждение: вложив IF, условие2 оценивается только тогда, когда условие1 истинно. В том, что я делаю, это означает, что условие2 будет оцениваться меньше, чем в первом варианте выше.

И - это обычные логические "и" (истина, если и только если оба условия верны). Под ЕСЛИ я подразумеваю ЕСЛИ [ условие , когда условие истинно, когда условие ложно].

Надеюсь, мой вопрос не слишком некорректен; Я уверен, что есть примеры, когда первый вариант будет работать быстрее. Я просто надеялся, что в общем-то что-то верно.

Спасибо.

Ответы [ 4 ]

8 голосов
/ 30 ноября 2010

Mathematica замкнет оценку And и Or, если результат станет известен до оценки всех условий.

Вы можете увидеть это, используя условие, которое (искусственно) занимает много времени:

Timing[If[False && (Pause[10]; True), True, False]]
Timing[If[False, If[(Pause[10]; True), True, False], False]]

и увидим, что оба возвращаются в доли секунды, а не через десять секунд.

5 голосов
/ 30 ноября 2010

Часто (но не всегда) языки будут иметь функцию, называемую логика короткого замыкания , при которой второй операнд в условии AND будет оцениваться только в том случае, если первый равен true (также для OR, второй будет оцениваться только в том случае, если первое неверно). Однако это будет зависеть от языка.

3 голосов
/ 30 ноября 2010

Я сделал немного времени на

Nest[Defer@If[True, #] &, True, 300];

против

If[True && << 298 >> && True, True];

, что является полным излишеством, но тем не менее забавным. Вложенные операторы If[] были в три раза медленнее, чем If[] с 300 логическими AND. Однако с изменением первого оператора True на False таблицы поворачиваются, а вложенные операторы If[] в три раза быстрее .

1 голос
/ 30 ноября 2010

Вы спрашиваете об определенном языке или просто в целом?

Многие, но не все языки имеют операторы короткого замыкания AND и OR, где они останавливают оценку, когда знают ответ.Для AND это означает, что если левая сторона, если ложь, ответ ложен, и правая сторона не нуждается в оценке.Для OR, если левая сторона верна, тогда ответ верен, и правая сторона не нуждается в оценке.

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

...