우리 모두 알고 있듯이 Python은 효율적인 언어가 아닙니다. 또한 루핑은 모든 언어에서 매우 시간이 많이 걸리는 작업입니다. 간단한 단일 단계 작업에 1 단위 시간이 소요된다면 이 작업을 수만 번 반복하면 최종 소요 시간도 수만 배 증가합니다.
while과 for는 Python에서 루프를 구현할 때 일반적으로 사용되는 두 가지 키워드이지만 실제로는 운영 효율성에 차이가 있습니다. 예를 들어 다음 테스트 코드는
import timeit def while_loop(n=100_000_000): i = 0 s = 0 while i < n: s += i i += 1 return s def for_loop(n=100_000_000): s = 0 for i in range(n): s += i return s def main(): print('while looptt', timeit.timeit(while_loop, number=1)) print('for looptt', timeit.timeit(for_loop, number=1)) if __name__ == '__main__': main() # => while loop 4.718853999860585 # => for loop 3.211570399813354
1부터 n까지 모든 자연수의 합을 구하는 간단한 합 연산입니다. for 루프가 while보다 1.5초 더 빠른 것을 볼 수 있습니다.
가장 큰 차이점은 둘의 메커니즘이 다르다는 것입니다.
각 루프에서 while은 실제로 for보다 두 단계 더 많은 단계, 즉 경계 검사와 변수 i 증가를 수행합니다. 즉, 루프가 수행될 때마다 while은 경계 검사(while i
for 루프는 범위 검사 및 증분 작업을 수행할 필요가 없으며 명시적인 Python 코드를 추가하지 않습니다(순수한 Python 코드는 기본 C 코드보다 효율성이 떨어집니다). 사이클 수가 충분히 크면 상당한 효율성 격차가 나타납니다.
두 개의 함수를 더 추가하고 for 루프에 불필요한 경계 검사 및 자동 증가 계산을 추가할 수 있습니다.
import timeit def while_loop(n=100_000_000): i = 0 s = 0 while i < n: s += i i += 1 return s def for_loop(n=100_000_000): s = 0 for i in range(n): s += i return s def for_loop_with_inc(n=100_000_000): s = 0 for i in range(n): s += i i += 1 return s def for_loop_with_test(n=100_000_000): s = 0 for i in range(n): if i < n: pass s += i return s def main(): print('while looptt', timeit.timeit(while_loop, number=1)) print('for looptt', timeit.timeit(for_loop, number=1)) print('for loop with incrementtt', timeit.timeit(for_loop_with_inc, number=1)) print('for loop with testtt', timeit.timeit(for_loop_with_test, number=1)) if __name__ == '__main__': main() # => while loop 4.718853999860585 # => for loop 3.211570399813354 # => for loop with increment4.602369500091299 # => for loop with test 4.18337869993411
추가된 경계 검사 및 자동 증가 연산이 for 루프의 실행 효율성에 큰 영향을 미치는 것을 볼 수 있습니다. .
앞서 언급했듯이 Python의 기본 인터프리터와 내장 함수는 C 언어로 구현됩니다. C 언어의 실행 효율성은 Python보다 훨씬 높습니다.
위의 산술 시퀀스의 합을 구하는 연산의 경우 Python에 내장된 sum 함수를 사용하면 for 또는 while 루프보다 훨씬 더 큰 실행 효율성을 얻을 수 있습니다.
import timeit def while_loop(n=100_000_000): i = 0 s = 0 while i < n: s += i i += 1 return s def for_loop(n=100_000_000): s = 0 for i in range(n): s += i return s def sum_range(n=100_000_000): return sum(range(n)) def main(): print('while looptt', timeit.timeit(while_loop, number=1)) print('for looptt', timeit.timeit(for_loop, number=1)) print('sum rangett', timeit.timeit(sum_range, number=1)) if __name__ == '__main__': main() # => while loop 4.718853999860585 # => for loop 3.211570399813354 # => sum range0.8658821999561042
내장 함수 sum을 사용하여 루프를 교체한 후 코드 실행 효율성이 기하급수적으로 증가한 것을 확인할 수 있습니다.
내장 함수 sum의 누적 연산은 실제로 루프이지만 C 언어로 구현된 반면, for 루프의 합 연산은 순수 Python 코드 s += i로 구현됩니다. C > 파이썬. 생각의 폭을 다시 넓혀보세요. 우리 모두는 어린 시절 가우스가 1부터 100까지의 합을 계산하는 천재적인 이야기를 듣고 자랐습니다. 1…100의 합은 (1 + 100) * 50과 같습니다. 이 계산 방법은 위의 합산 연산에도 적용될 수 있습니다.import timeit def while_loop(n=100_000_000): i = 0 s = 0 while i < n: s += i i += 1 return s def for_loop(n=100_000_000): s = 0 for i in range(n): s += i return s def sum_range(n=100_000_000): return sum(range(n)) def math_sum(n=100_000_000): return (n * (n - 1)) // 2 def main(): print('while looptt', timeit.timeit(while_loop, number=1)) print('for looptt', timeit.timeit(for_loop, number=1)) print('sum rangett', timeit.timeit(sum_range, number=1)) print('math sumtt', timeit.timeit(math_sum, number=1)) if __name__ == '__main__': main() # => while loop 4.718853999860585 # => for loop 3.211570399813354 # => sum range0.8658821999561042 # => math sum 2.400018274784088e-06수학 합계의 최종 실행 시간은 약 2.4e-6으로, 이는 수백만 배 단축됩니다. 여기서 아이디어는 루프의 효율성이 낮기 때문에 코드 조각을 수억 번 실행해야 한다는 것입니다. 루프하지 말고 수학 공식을 사용하여 수억 개의 루프 작업을 단 한 단계로 바꾸세요. 이전과는 비교할 수 없을 정도로 효율성이 자연스럽게 향상되었습니다. 최종 결론(약간 수수께끼): 루프를 구현하는 가장 빠른 방법은 - - - 루프를 사용하지 않는 것입니다. Python의 경우 내장 함수를 최대한 많이 사용하고 순수 Python 코드를 루프가 가장 낮은 수준으로 떨어집니다.
위 내용은 어떤 Python 루핑 방법이 가장 빠른가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!