반응형
본 시리즈는 도서 "파이썬 코딩의 기술"에 들어있는 파이썬 중급자들을 위한 기술들을 정리한 것이다. 책의 요약 + 부가 설명 이라고 생각하면 될 것이다. 더 많은 파이썬다운 기술들을 살펴보고 싶다면 하단의 링크를 참고하자 (추가예정).
Better Way 9 컴프리헨션이 클 때는 제너레이터 표현식을 고려하자
리스트 컴프리헨션이란?
시퀀스에서 리스트를 만들어내는 간단한 방법
a = [1, 2, 3, 4, 5, 6, 7]
squares = [i**2 for i in a]
print(squares)
출력: [1, 4, 9, 16, 25, 36, 49]
a를 사용하여 각 원소의 제곱을 원소로 가지고 있는 리스트를 간단하게 만들어 볼 수 있다. 해당 방식은 map이나 filter 기반의 코드보다 간결하게 리스트를 생성할 수 있다. 리스트뿐만 아니라 파이썬의 딕셔너리와 세트에서도 유사하게 사용할 수 있다.
하지만 이러한 리스트 컴프리헨션의 문제점은 데이터의 양이 많아지게 되면 메모리를 많이 소모하여 프로그램을 망가뜨린다. 리스트 컴프리헨션의 경우 리스트를 생성할 때 모든 요소를 한번에 계산하고 전체를 한번에 생성하기 때문에 메모리 사용량에 제약이 걸릴 수 있다.
이러한 문제점을 해결하기 위해 제너레이터가 등장하였다.
제너레이터란?
제너레이터 표현식은 아래와 같이 ( ) 를 사용하여 생성한다.
a = [1, 2, 3, 4, 5, 6, 7]
squares = (i**2 for i in a)
print(squares)
출력: <generator object <genexpr> at 0x104f1d120>
제너레이터 표현식은 이터레이터 프로토콜을 따른다. 따라서 아래와 같이 내장 함수 next를 사용해서 이터레이터를 반환할 수 있다.
print(next(squares))
print(next(squares))
출력:
1
4
제너레이터 표현식은 이터레이터로 한번에 한 출력만 만든다. 즉, 실행될 때 출력 시퀀스를 모두 메모리에 적재할 필요가 없다. 필요한 순간에 딱 계산해서 내어줄 것이다. 따라서 리스트 컴프리헨션보다 큰 입력 시퀀스에 대해 적절히 대응할 수 있다.
반응형