여기에 대한 대답은 다른 대답이 제안하는 것보다 조금 더 미묘하다고 생각하지만 그 요점은 정확하지만 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입니다. 그리고 루프를 통해 빌트인을 사용할 수있을 때 시작하지 마십시오 ....