본문 바로가기

Program Languages/Python

파이썬 반복문 사용법(for, while)

컴퓨터 프로그래밍에서는 게임개발, 멀티 태스킹, 여러 알고리즘등 여러 컴퓨터 작업에서 반복문을 많이 사용합니다.

 

따라서 이번 포스트에서는 파이썬에서 모듈 라이브러리등을 사용하지 않고 for,while등 기본적인 문법을 사용한 반복문 작성을 알아보고자 합니다.

 

 

for,while 반복문 기본 문법

#아래 예제들은 0~9까지의 숫자를 더하는 예제입니다.
#value = sum(range(10)) :P


"""
for assigned_value in <any iterable object instance>:
    ...
"""
value = 0
for i in range(10):#iteration 마지막 원소 이후일 때 까지 이거나 stopiteration같은 소프트 에러가 발생할 때 까지 내부 코드들을 실행
    #for문 시작점
    if(i == -1):
    	continue#이후의 아래 코드들을 실행하지 않고 해당 iteration을 다음 iteration으로 넘겨서 for문 범위 조건의 마지막에 도달할 때까지 for문 시작점으로 돌아갑니다. 
    elif(i == -2):
        break#이후의 아래 코드들을 실행하지 않고 for문을 종료합니다.
    else:
    	pass#그냥 절차상 다음으로 실행될 코드로 이동합니다.
    value += i
    
else:#for문 조건이 False인 경우(혹은 for문 조건의 마지막에 도달한 경우) 아래 안쪽 코드를 실행합니다.(생략가능)
    print("for문 결과값:",value)
    
    
    

value = 0
i=0
while(i<10):#해당 조건이 참값일 동안만 안쪽 내부 코드들을 실행(여기서는 i값이 10미만일 동안만)
    #while문 시작점
    if(i == -1):
    	continue#이후의 아래 코드들을 실행하지 않고 해당 iteration(?)(i)을 다음 iteration(?)(i+1)으로 넘겨서 while문 범위 조건의 마지막에 도달할 때까지 while문 시작점으로 돌아갑니다. 
    elif(i == -2):
        break#이후의 아래 코드들을 실행하지 않고 while문을 종료합니다.
    else:
    	pass#그냥 절차상 다음으로 실행될 코드로 이동합니다.
    value += i
    i+=1
else:#while문 조건이 False인 경우(혹은 while문 조건의 마지막에 도달한 경우) 아래 안쪽 코드를 실행합니다.(생략가능)
    print("while문 결과값:",value)

결과 사진으로 부터 for문과 while문의 결과가 같도록 잘 나온다는 것을 알 수 있었습니다.

 

위의 예제는 이해만 하면 너무 간단하니 조금 더 for문과 while문을 활용해 보도록 하겠습니다.


아래 코드는 파이썬에서 프로세스 시간을 기준으로 for문과 while문의 걸리는 시간을 측정해보는 코드입니다.

import time
def GetCurrentTime() -> int:
    return time.process_time_ns()
def length만큼반복하기(length:int = 1000) -> tuple:
    assert(type(length) is int and length>0)
    length = 1000
    index = 0
    
    while문_걸린시간_값들 = [0]*(length)
    for문_걸린시간_값들 = [0]*(length)
    
    while문_총_걸린시간 = time.time_ns()
    tmp_time = GetCurrentTime()
    
    while(index<length):#<while문 조건 부분>
        cur_time = GetCurrentTime()
        while문_걸린시간_값들[index] = cur_time-tmp_time
        tmp_time = cur_time
        index += 1
    while문_총_걸린시간 = time.time_ns() - while문_총_걸린시간
    index = 0
    
    for문_총_걸린시간 = time.time_ns()
    tmp_time = GetCurrentTime()
    
    for _ in range(0,length):
        cur_time = GetCurrentTime()
        for문_걸린시간_값들[index] = cur_time-tmp_time
        tmp_time = cur_time
        index+=1
    for문_총_걸린시간 = time.time_ns() - for문_총_걸린시간
    return (while문_총_걸린시간,while문_걸린시간_값들),(for문_총_걸린시간,for문_걸린시간_값들)

 

 

 

위의 그래프 결과값 평균치를 수치로 나타내면 다음과 같습니다.

(하드웨어 성능, 파이썬 메모리 관리 알고리즘,현재 CPU 유휴상태등이 따라 결과가 일정하지 않을 수 있습니다.)

해당 결과를 참고해 iteration당 걸린 평균시간을 비교해 볼 때, 내부 로직이 되도록 비슷하다면 for문과 while문 간의 성능 차가 그렇게 많이 발생하지 않는다는 것을 알 수 있습니다.

 

 

 

'length(=1000)만큼반복하기'함수에서 while문 조건 부분을

while(0<=index<length):

로 바꾸어 보면 어떻게 될까요?

 

몇번을 다시 실행해 보아도 평균적으로 while문이 for문 보다 미묘하게 시간이 더 걸리는 것을 위의 결과들로 알 수 가 있었습니다.

 

 

 

 'length(=1000)만큼반복하기' 함수에서 각 반복문에 최적화에 가깝게 로직을 작성해 보면 어떻게 될까요?

#이 예제에서는 
  while(index<length): #로 다시 원래대로 바꾸고

  #for문 부분을
  for i in range(0,length):
      cur_time = getCurrentTime()
      for_loop_elapsed_times[i] = cur_time-tmp_time
      tmp_time = cur_time
   #으로 바꾸어 다시 실행해 보았습니다.

위의 결과 사진을 보면, 결과 차이가 이전의 결과보다 더 크다는 것을 알 수가 있었습니다.

 

 

 

while문과 for문의 비교 결론

비슷한 로직인경우 for문,while문 사이에 큰 차이가 없다.
비슷한 로직인데 while문 조건이 복잡한 경우 while문 보다 for문이 조금 더 빠르다.
각 반복문에 최적에 가까운 로직을 사용하는 경우 평균적으로 while보다 for문이 빠르다.
결론 현재 파이썬에서는 while문 보다 for문이 빠르다.
더보기

그 이유는 아마도 while문의 조건문이 파이썬에서는 비교와 관련된 알고리즘으로 이루어진 코드 블럭을 추가적으로 연결 및 관리하며 매 iteration마다 복잡한 조건문을 동적으로 체크하는 반면,

for문은 해당 iteration에 대한 간략한 정보가 전처리로 연결 및 관리되고 있으며 각 증분크기만큼 코드블록으로 이동하는 것과 iterable 객체의 마지막 원소에 도달했는지만 확인하면 되기 때문일 것 같습니다.

또한 while문이 속도면에서는 평귡적으로 느리지만 일련의 순서가 없을 때나 순서가 일정하지 않을 떄 사용하기에 유용하다는 장점이 있습니다.