Я думаю, що відповідь тут трохи тонша, ніж пропонують інші відповіді, хоча суть її правильна: цикл 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 для вас. І навіть не заводи мене, коли ти взагалі можеш використовувати вбудований цикл ....