Оптимальная функция выхода из цикла - PullRequest
0 голосов
/ 28 октября 2019

Допустим, есть функция, не возвращающая ничего, в которой есть цикл. В какой-то момент вызов функции должен быть завершен (в цикле). Чтобы быть понятным, цикл всегда будет повторяться несколько раз. Для этого есть 2 способа:

1. Завершающий цикл с break:

def func():
    while True:
        do_smth....
        if condition:
            break

2. немедленное завершение вызова функции с помощью return:

def func():
    while True:
        do_smth....
        if condition:
            return

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

Ответы [ 3 ]

1 голос
/ 28 октября 2019

Разница между этими двумя методами наследуется по назначению.

оператор break предназначен для использования внутри цикла и остановки итерации при переходе к break.

* 1006. * оператор return предназначен для остановки выполнения функции и возврата значения.

разница во времени вызвана процедурой, которая начинается при переходе к break / return;Вы можете видеть, что на уровне инструкций операторы делают разные вещи -> вызывая разные моменты времени:

import dis

def x():
    while True:
        return

def y():
    while True:
        break


print(dis.dis(x))
print(dis.dis(y))

Вывод: для x:

4           0 SETUP_LOOP               4 (to 6)

  5           2 LOAD_CONST               0 (None)
              4 RETURN_VALUE
        >>    6 LOAD_CONST               0 (None)
              8 RETURN_VALUE

для y:

  8           0 SETUP_LOOP               6 (to 8)

  9     >>    2 BREAK_LOOP
              4 JUMP_ABSOLUTE            2
              6 POP_BLOCK
        >>    8 LOAD_CONST               0 (None)
             10 RETURN_VALUE

Очевидно, что если вы просто сравниваете разницу в фиктивном примере , который вы дали, return будет быстрее.

1 голос
/ 28 октября 2019

Выполнение цикла «считать до 10» 10 млн раз с timeit.timeit показывает, что прямой return работает немного быстрее, поэтому, вероятно, должен быть путь.

0 голосов
/ 28 октября 2019

Оптимальный используется для описания наилучшей производительности кода (обозначение big-O). Единственный случай, в котором на вопрос было бы разумно ответить, это если break или return где в цикле, и вам пришлось выйти как можно быстрее из-за сложной процедуры> O (n), в которой выbreak редактировал много раз, что действительно было бы редким случаем и явным индикатором плохого дизайна. Как вы можете видеть из других ответов, даже в этом случае это не окажет большого влияния на ваш код.

Теперь, предположив, что «оптимальный» относится к коду в целом, ни один из выбранных вариантов не является хорошим вообще,В общем, этот фрагмент кода должен быть переведен в

def func():
    while not condition:
        do_smth....

возврат с разрывом / пустым, используется в очень особых случаях для удобства чтения, и я бы сказал, никогда по соображениям эффективности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...