데이터 엔지니어링/Python

Iterator(이터레이터)와 list(리스트)의 동작 차이

데이터길드장 2024. 11. 30. 18:53

 

코딩테스트를 준비하다가 역순을 사용하는 부분에서 객체의 메모리 주소를 보여주는 부분을 목격했다.

이 메모리 주소는 이터레이터의 객체 주소를 보여주는데, 이터레이터와 리스트의 차이가 무엇인지 찾아보다가 기록을 해둔다.

두 개념은 비슷해 보이지만, 데이터를 처리하는 방식사용 방법에서 큰 차이가 있다.

이터레이터는 마치 과자 자판기와 같다.

  • 자판기에서는 버튼을 한 번 누를 때마다 과자가 하나씩 나온다.
  • 하지만 모든 과자를 다 꺼내고 나면 더 이상 과자를 받을 수 없다.

이처럼 이터레이터의 특징을 볼 수 있는데, 이터레이터는 한번만 사용할 수 있고, 메모리에 모든 데이터를 저장하지 않고 필요할때만 생성한다는 점, 그리고 다시 사용하려면 새로 생성해야한다는 점이다.

l = [1, 2, 3, 4, 5]
iter_obj = iter(l)

print(next(iter_obj))  # 1
print(next(iter_obj))  # 2
print(next(iter_obj))  # 3

for value in iter_obj:
    print(value)  # 출력: 4, 5

# 더 이상 꺼낼 수 없음
for value in iter_obj:
    print(value)  # 출력 없음

이 코드에서 next(iter_obj)를 호출할 때마다 자판기에서 과자 하나를 꺼내는 것처럼 값이 하나씩 반환된다.
하지만 모든 값을 다 꺼낸 후에는 이터레이터가 비워져 아무것도 출력되지 않는다.


 

리스트는 과자 바구니다

  • 바구니에는 모든 과자가 한 번에 담겨 있다.
  • 원하는 만큼 여러 번 꺼낼 수 있고 순서를 바꿔서 꺼낼 수도 있고 마음대로 꺼낼 수 있다.

리스트의 특징은 여러 번 반복이 가능하고, 메모리에 모든 데이터를 저장한다. 또한 데이터를 인덱스로 직접 접근을 할 수도 있다는 점이다.

l = [1, 2, 3, 4, 5]

for value in l:
    print(value)  # 출력: 1, 2, 3, 4, 5

for value in l:
    print(value)  # 출력: 1, 2, 3, 4, 5

리스트는 몇 번이든 순회할 수 있고, 언제든지 처음부터 다시 사용할 수 있다.
이 점에서 이터레이터와 큰 차이가 있다.


 

리스트 이터레이터
모든 데이터를 메모리에 저장 필요할 때마다 데이터를 생성
데이터를 여러 번 순회할 수 있음 데이터를 한 번만 순회할 수 있음
데이터 크기가 작을 때 적합 데이터 크기가 클 때 적합
인덱스로 직접 접근 가능 순차적으로만 접근 가능

 

 

만약 이터레이터를 여러 번 사용해야 한다면, 리스트로 변환해서 사용할 수 있다.

iter_obj = iter([1, 2, 3, 4, 5])
l = list(iter_obj)  # 이터레이터를 리스트로 변환

for value in l:
    print(value)  # 출력: 1, 2, 3, 4, 5
    
for value in l:
    print(value)  # 출력: 1, 2, 3, 4, 5

 

 

반응형