Когда я должен использовать для l oop или какое-то время l oop? - PullRequest
0 голосов
/ 20 января 2020

Меня смущает, когда используется while-l oop или for-l oop лучше? Я особенно обеспокоен получением оптимизированных ответов на вопросы кодирования. Я решаю проблемы, просто чтобы выяснить, какое-то время - l oop было бы быстрее, но меня смущает то, что побуждает людей выбирать его вместо for-l oop, например, какие критерии мне следует искать за? Вот пример вопроса о кодировании, на который я ответил, который проверяет, сбалансирована ли строка скобок.

def parenCheck(str):
    stack = Stack()
    for x in str:
        if x == '(':
            stack.push(x)
        else:
            if stack.isEmpty():
                return False
            else:
                stack.pop()
    return stack.isEmpty()

Вот ответ, который я нашел для него, который я знаю быстрее, потому что он не использует for-l oop:

def parChecker(symbolString):
    s = Stack()
    balanced = True
    index = 0
    while index < len(symbolString) and balanced:
        symbol = symbolString[index]
        if symbol == "(":
            s.push(symbol)
        else:
            if s.isEmpty():
                balanced = False
            else:
                s.pop()

        index = index + 1

    if balanced and s.isEmpty():
        return True
    else:
        return False

Ответы [ 2 ]

1 голос
/ 20 января 2020

Ваш код не может решить, что пока l oop работает быстрее, чем для l oop. Что касается вашего вопроса о том, когда использовать while и для l oop, это решается на основе того, знаем ли мы число итераций. Если число итераций известно, для l oop предпочтительнее, тогда как l oop является предпочтительным, когда итерации неопределенны.

for (int i : mynumber_list)
Iterator it  = mynumber_list.iterator()
while (it.hasNext())

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

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

0 голосов
/ 20 января 2020

Для того же количества итераций и контента, я предполагаю, что for l oop и wihile имеют практически одинаковую скорость. Но я этого не проверял - в основном я отвечаю на numpy вопросов, где мы стараемся избегать либо l oop (предпочитая итерации в скомпилированном коде).

В ваших примерах показан базовый c случай, когда for приводит к чистоте, если не быстрее, код:

for x in an_iterator:
    <do something>

против

i = 0
while i < len(an_iterator):
     x = an_iterator[x]
     <do something>
     i += 1

Если у вас также должен быть индекс, вы можете использовать:

 for i, x in enumerate(an_iterator):
      ....

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

Общий подслуча for loop накапливает значения , настолько распространенный, что Python предоставляет популярный list comprehension и расширил синтаксис для выражений генератора и словарных пониманий.

while все еще имеет свое применение. Другие языки имеют варианты do while и do until, которые пытаются упростить пошаговое выполнение переменной и тестирование. Python имеет только одну версию с отдельными шагами. Новый оператор walrus имеет потенциал очистки:

https://docs.python.org/3/whatsnew/3.8.html#assignment-expressions
while (block := f.read(256)) != '':
    process(block)

while наиболее полезен, когда шаги не регулярны или из хорошо определенного итератора. for может break и continue, но в остальном последовательность является фиксированной (в начале итерации).

В дополнение к enumerate, zip позволяет выполнять итерацию сразу по нескольким вещам .

Удобство понимания списков побуждает нас разбивать сложную задачу на последовательность пониманий. И чтобы сделать это еще более удобным (и более быстрым / эффективным по памяти), Python предоставляет генераторы и все такое, itertools. В Python 3, range и словаре keys/items/values все стало выражениями, подобными генераторам.

...