리스트 컴프리헨션을 사용할 경우 입력이 커지면 메모리를 상당히 많이 사용한다.
value = [len(x) for x in open('my_file.txt')]
print(value)
[5, 4, 9, 17, 9, 11, 8, 9, 11, 8, 5]
제너레이터 식은 리스트 컴프리헨션과 제너레이터를 일반화한 것이다.
제너레이터 식을 실행해도 출력 시퀀스 전체가 실체화되지는 않는다.
그대신 제너레이터 식에 들어 있는 식으로부터 원소를 하나씩 만들어내는 이터레이터가 생성된다.
it = (len(x) for x in open('my_file.txt'))
print(it)
<generator object <genexpr> at 0x7f86f8c8cc10>
print(next(it))
print(next(it))
5 4
메모리를 모두 소모하는 것을 막을 수 있음
제너레이터 식의 또 다른 강력한 특징은 두 제너레이터 식을 합성할 수 있다.
roots = ((x, x**0.5) for x in it)
print(next(roots))
(9, 3.0)
print(next(roots))
(17, 4.123105625617661)
이처럼 제너레이터를 함께 연결한 코드를 파이썬은 아주 빠르게 실행할 수 있다.
아주 큰 입력 스트림에 대해 여러 기능을 합성해 적용해야 한다면, 제너레이터 식을 선택하라.
다만 이터레이터이므로 한번만 사용해야 한다.