iterator와 lazy evaluation
Python

iterator와 lazy evaluation

면접 스터디에서 질문 iterator와 iterable의 차이점은 무엇입니까? 에 대해 공부하다가 궁금증이 생겼다.

먼저 질문에 답을 해보자면,

  1. iterator
    1. iterable 객체를 순회하는 객체
    2. iter() : iterable 객체로부터 iterator를 생성하는 메소드
    3. next() : 메소드로 다음 요소를 탐색한다. (__next()__ 를 호출)
  2. iterable
    1. 한 번에 하나씩 돌려줄 수 있는 특성
      1. iterable 한 객체 = 한 번에 하나씩 돌려줄 수 있는 객체라는 뜻 = 순회할 수 있는 객체
    2. e.g. list, set, tuple, dictionary, string

로 정리할 수 있다. 

 

또 중요한 점은 iterator는 항상 iterable 하지만, iterable 한 객체는 무조건 iterator가 되는 것은 아니라는 점이다.

 

* 순회 

자료구조 내부의 요소를 하나씩 인덱싱하는 것을 말한다. 

sample_list = [1, 2, 3]

for element in sample_list:
	print(element)

위 코드를 보면 쉽게 이해할 수 있다.

반복문을 통해 요소를 불러오는 것을 순회라고 한다.

파이썬 외에도 다른 언어에서도 통용되는 개념이라고 한다. 

 

iterable과 같이 생각해보면

반복문을 사용할 수 있는, sample_list에 들어갈 수 있는 모든 자료구조는 순회가 가능하다.

 

그렇다면 iterable 한 객체의 예로 들었던 list, set, tuple등 iterable한 객체가 이미 있는데

왜 iterator를 생성하는 것일까?

iterator만이 갖는 특별한 장점이 무엇일까?


lazy evaluation

게으른 연산이 가능하다.

 

iterable은 메모리에 배열에 크기에 해당하는 공간이 바로 할당된다.

반면 iterator는 생성할 당시에 할당하지 않는다.

 

이 차이점은 용량이 매우 큰 자료를 사용할 때 두드러진다.

 

iterator는 필요할 때마다 로딩하기 때문에 메모리를 절약할 수 있어 안정성이 담보된다. 

 

다음은 둘의 차이를 확인하기 쉬운 예시이다.

 

big_list는 list comprehension, big_gen은 generator comprehension이다. 

*generator : iterator를 생성하는 함수 

list는 너무 큰 용량으로 인해 인터프리터가 종료되었으나, iterator는 오류없이 실행되었다.

 

 

 

참고 자료

- [Python] Iterable, Iterator 그리고 Generator

- [python] Lazy Evaluation

 

반응형

'Python' 카테고리의 다른 글

튜플 (Tuple)  (0) 2022.08.26