Для того же количества итераций и контента, я предполагаю, что 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
все стало выражениями, подобными генераторам.