Я думаю, что ответ здесь немного более тонкий, чем предполагают другие ответы, хотя суть его верна: цикл for быстрее, потому что больше операций происходит на C и меньше на Python .
В частности, в случае цикла for в C происходят две вещи, которые в цикле while обрабатываются в Python:
В цикле while сравнение i < 100000000
выполняется в Python, тогда как в цикле for задание передается итератору range(100000000)
, который внутренне выполняет итерацию (и, следовательно, проверку границ) в C.
В цикле while обновление цикла i += 1
происходит в Python, тогда как в цикле for снова итератор range(100000000)
, написанный на C, выполняет i+=1
(или ++i
).
Мы видим, что комбинация этих двух вещей ускоряет цикл for, добавляя их вручную, чтобы увидеть разницу.
import timeit
N = 100000000
def while_loop():
i = 0
while i < N:
i += 1
def for_loop_pure():
for i in range(N):
pass
def for_loop_with_increment():
for i in range(N):
i += 1
def for_loop_with_test():
for i in range(N):
if i < N: pass
def for_loop_with_increment_and_test():
for i in range(N):
if i < N: pass
i += 1
def main():
print('while loop\t\t', timeit.timeit(while_loop, number=1))
print('for pure\t\t', timeit.timeit(for_loop_pure, number=1))
print('for inc\t\t\t', timeit.timeit(for_loop_with_increment, number=1))
print('for test\t\t', timeit.timeit(for_loop_with_test, number=1))
print('for inc+test\t', timeit.timeit(for_loop_with_increment_and_test, number=1))
if __name__ == '__main__':
main()
Я пробовал это как с числом 100000000 - буквальной константой, так и с переменной, N
что было бы более типично.
while loop 3.5131139
for pure 1.3211338000000001
for inc 3.5477727000000003
for test 2.5209639
for inc+test 4.697028999999999
while loop 4.1298240999999996
for pure 1.3526357999999998
for inc 3.6060175
for test 3.1093069
for inc+test 5.4753364
Как видите, в обоих случаях while
время очень близко к разнице for inc+test
и for pure
. Также обратите внимание, что в случае, когда мы используем N
переменную, while
имеет дополнительное замедление для многократного поиска значения N
, но for
не делает.
Это действительно безумие, что такие тривиальные модификации могут привести к ускорению кода более чем в 3 раза , но это Python для вас. И даже не заставляйте меня начинать, когда вы вообще можете использовать встроенную функцию над циклом ....