더북(TheBook)

BETTER WAY 9
컴프리헨션이 클 때는 제너레이터 표현식을 고려하자

 

 

리스트 컴프리헨션의 문제점(Better way 7 “mapfilter 대신 리스트 컴프리헨션을 사용하자” 참고)은 입력 시퀀스에 있는 각 값별로 아이템을 하나씩 담은 새 리스트를 통째로 생성한다는 점이다. 입력이 적을 때는 괜찮지만 클 때는 메모리를 많이 소모해서 프로그램을 망가뜨리는 원인이 되기도 한다.

예를 들어 파일을 읽고 각 줄에 있는 문자의 개수를 반환한다고 하자. 이 작업을 리스트 컴프리헨션으로 하면 파일에 있는 각 줄의 길이만큼 메모리가 필요하다. 파일에 오류가 있거나 끊김이 없는 네트워크 소켓일 경우 리스트 컴프리헨션을 사용하면 문제가 발생한다. 다음은 입력값이 적은 경우만 처리할 수 있는 방식으로 리스트 컴프리헨션을 사용한 예다.

value = [len(x) for x in open(‘/tmp/my_file.txt’)]

print(value)

 

>>>

[100, 57, 15, 1, 12, 75, 5, 86, 89, 11]

 

파이썬은 이 문제를 해결하려고 리스트 컴프리헨션과 제너레이터를 일반화한 제너레이터 표현식(generator expression)을 제공한다. 제너레이터 표현식은 실행될 때 출력 시퀀스를 모두 구체화(여기서는 메모리에 로딩)하지 않는다. 대신에 표현식에서 한 번에 한 아이템을 내주는 이터레이터(iterator)로 평가된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.