Замедляет ли Python уменьшение () короткого замыкания?

Если я сделаю:

result = reduce(operator.and_, [False] * 1000)

Будет ли он остановлен после первого результата? (поскольку Ложь и прочее == Ложь )

Аналогично:

result = reduce(operator.or_, [True] * 1000)
13
задан Reinstate Monica 25 August 2010 в 22:09
поделиться

2 ответа

Нет. Альтернативой в этом случае является любой и все.

result = reduce(operator.and_, [False] * 1000)
result = reduce(operator.or_, [True] * 1000)

можно заменить на

result = all([False] * 1000)
result = any([True] * 1000)

, которые делают короткое замыкание.

Временные результаты показывают разницу:

In [1]: import operator

In [2]: timeit result = reduce(operator.and_, [False] * 1000)
10000 loops, best of 3: 113 us per loop

In [3]: timeit result = all([False] * 1000)
100000 loops, best of 3: 5.59 us per loop

In [4]: timeit result = reduce(operator.or_, [True] * 1000)
10000 loops, best of 3: 113 us per loop

In [5]: timeit result = any([True] * 1000)
100000 loops, best of 3: 5.49 us per loop
21
ответ дан 1 December 2019 в 19:58
поделиться

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

5
ответ дан 1 December 2019 в 19:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: