파이썬 반복문 속도를 빠르게 하는 방법 : python for 문과 timeit()
컴퓨터는 단순 반복작업에 특화된 기계입니다. python에서는 for 문과 while 문이 단순 반복작업을 담당해줍니다. 이번 포스팅에서는 어떻게 하면 파이썬 반복문의 실행속도를 높일 수 있을지 timeit 모듈로 실험해보겠습니다.
글의 순서
파이썬 실행 속도
파이썬 성능 측정을 위한 timeit 모듈과 반복문 속도 비교 : for vs. while
파이썬 반복문 속도를 빠르게 하기 위한 방법
파이썬 실행 속도
파이썬은 스크립트 언어이기 때문에 컴파일 언어에 비해 속도가 느리다는 것이 일반적인 견해입니다. 그런데, 파이썬은 1기가 미만의 데이터를 메모리에 올려놓고 작업하기 때문에 용량이 1GB 미만인 데이터의 경우 큰 불편함을 못 느낍니다. 실제로 참고자료 2에서는 Python과 C#의 딥러닝 성능 비교를 하였는데, python이 컴파일 언어인 C#보다 불과 6% 정도만 떨어졌다는 실험결과를 발표했습니다.
그렇지만 코딩을 할 때는 이왕이면 빠르게 돌아갈 수 있게 해야 합니다. 이번 포스팅에서는 python for 문을 효율적이고 빠르게 돌릴 수 있는 방법을 정리해보겠습니다.
파이썬 성능 측정을 위한 timeit 모듈과 파이썬 반복문 속도 비교 : for vs. while
일반적으로 파이썬 성능측정에는 timeit 모듈이 사용됩니다. timeit은 코드 일부분의 실행 시간을 측정할 때 사용할 수 있으며, 실습코드01과 같은 방식을 사용합니다.
실습코드01은 while 문과 for 문을 사용해서 1부터 100만까지 더하는 함수를 만든 후, timeit 모듈로 실행시간을 측정하는 코드입니다. timeit() 모듈로 넘겨주는 인자는 실행하고자 하는 함수와 실행 회수입니다. 여기서는 while 문과 for 문으로 만든 함수를 1회씩(number=1) 실행하여 실행되는 시간을 측정하였습니다.
파이썬 반복문 실행결과 for 문이 while 문보다 훨씬 빠르다는 것을 확인할 수 있습니다. 참고로 이 시간은 사용하고 있는 컴퓨터와 작업환경(어떤 응용 프로그램을 실행시키고 있는지?)에 따라 다릅니다. 실습코드01과 아래 실습코드02에서의 결과가 미세하게 다른 이유입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import timeit def while_loop(n=100_000_000): i = 0 sum = 0 while i < n: sum += i i += 1 return sum def for_loop(n=100_000_000): sum = 0 for i in range(n): sum += i return sum def sum_numpy(n=100_000_000): return numpy.sum(numpy.arange(n)) print('while loop : ', timeit.timeit(while_loop, number=1)) print('for loop : ', timeit.timeit(for_loop, number=1)) |
1 2 |
while loop : 9.3998937 for loop : 5.4183527 |
파이썬 반복문 속도를 빠르게 하기 위한 방법
파이썬 반복문 for와 while 문을 실행했을 때 왜 실습코드01과 같은 결과가 나왔을까요? 참고자료 3에 따르면 파이썬의 반복문 부분은 C 코드로 작성되어 있는데, 반복 구분 자체만 그렇다고 설명합니다. 반복구분 안에 들어있는 명령구문은 파이썬이 처리한다는 것입니다. for 문의 i라는 변수가 증가되는 부분은 C가 처리하고 s += i 부분은 파이썬이 처리합니다. 반면, while 문에서는 i < n부터 아래의 s += i, i += 1 까지 모두 파이썬이 처리합니다. 따라서 python for 문을 쓸 때, 반복문 안에서 처리하는 명령구문의 개수를 줄여야 속도가 빨라진다는 것을 알 수 있습니다.
실습코드02에는 합계를 구하는 파이썬 내장함수를 썼을 때 더 빠르다는 것을 보여주고 있습니다. 놀라운 것은 numpy라는 수치해석에 특화된 파이썬 패키지를 사용했을 때입니다. 내장함수를 썼을 때가 2초 대였는데, numpy를 사용하면 0.2초대로 줄어듭니다. numpy를 사용하면 다양한 배열과 행렬을 손쉽게 만들 수 있으며, 계산이 무척 빨라집니다. numpy는 기본적으로 C언어로 작성된 패키지이기 때문입니다. numpy는 파이썬을 인스톨 할 때 자동적으로 인스톨되지 않기 때문에 pip install numpy와 같이 별도로 설치해주어야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import timeit import numpy def while_loop(n=100_000_000): i = 0 sum = 0 while i < n: sum += i i += 1 return sum def for_loop(n=100_000_000): sum = 0 for i in range(n): sum += i return sum def sum_range(n=100_000_000): return(sum(range(n))) def sum_numpy(n=100_000_000): return numpy.sum(numpy.arange(n)) print('while loop : ', timeit.timeit(while_loop, number=1)) print('for loop : ', timeit.timeit(for_loop, number=1)) print('sum_range : ', timeit.timeit(sum_range, number=1)) print('sum_numpy : ', timeit.timeit(sum_numpy, number=1)) |
1 2 3 4 |
while loop : 8.7630598 for loop : 5.682705899999998 sum_range : 2.9735856 sum_numpy : 0.23251630000000034 |
파이썬 반복문의 속도를 증가시킬 수 있는 방법을 정리해보면 다음과 같습니다.
▶while 문보다는 for 문을 사용한다.
▶for 문 내부의 명령어 개수를 줄인다.
▶파이썬 내장함수가 있다면 파이썬 내장함수를 사용한다.
▶숫자 계산이라면 수치해석에 특화된 파이썬 패키지인 numpy를 사용한다.
마치며 …
이번 포스팅에서는 어떻게 하면 파이썬 반복문의 실행속도를 높일 수 있을지 timeit 모듈로 실험해보았습니다. 스크립트 언어인 파이썬은 일반적으로 속도가 느리다고 알려져 있습니다만, 반복문에서는 이 부분을 만회할 수 있는 장치가 마련되어 있습니다.
python for 문의 변수 반복회수 부분을 컴파일 언어인 C로 처리하게 한 것인데요. 이 부분 말고 반복문 안에서 실행해야 하는 명령구문은 파이썬으로 처리하기 때문에, for 문의 속도를 높이려면 이 명령구문의 개수를 줄이고 단순하게 만들어야 합니다. 이런 장치가 없는 또 다른 반복문인 while문은 그래서 느립니다. python for 문을 쓸 때, 파이썬 내장함수가 있다면 그 함수를 사용하는 것이 빠릅니다. 만약 숫자 계산을 하는 반복문이라면, 수치해석에 특화된 패키지인 numpy를 적극적으로 사용하실 것을 추천합니다.
함께 참고하면 더 좋은 글 :
▶ python for 문 연습
▶ python for 문 : 파이썬답게 만드는 enumerate 함수
▶ 커피 로스팅 머신의 PID 제어기 파이썬 코딩
▶ 파이썬 프로그래밍 시작 (6) 반복문
▶ 파이썬 프로그래밍 시작 (7) 반복문과 무한루프
▶ 파이썬 데이터 분석! 데이터 분석을 위한 코딩언어 파이썬
▶ 파이썬 IDE 설정. 비주얼 스튜디오 코드(Visual Studio Code, VS code)
▶ 머신러닝 수학 : 데이터 벡터화
참고자료
[1] 김효관, 황원용. (2020). 파이썬 활용한 데이터 처리 성능 향상방법 제안. 한국정보전자통신기술학회 논문지, 13(4), 306-311.
[2] 이성진, 문상호. (2022). Keras를 이용한 Python과 C#의 딥러닝 성능 비교 분석. 한국정보통신학회 종합학술대회 논문집, 26(2), 360-363.
[3] mCoding, The Fastest Way to Loop in Python – An Unfortunate Truth
[4] python Tutorial 4. 기타 제어 흐름 도구