Skip to content

Latest commit

 

History

History
49 lines (37 loc) · 1.44 KB

BetterWay32.md

File metadata and controls

49 lines (37 loc) · 1.44 KB

32. 긴 리스트 컴프리헨션보다는 제너레이터 식을 사용하라

1. 리스트 컴프리헨션 단점

  • 입력 시퀀스와 같은 수의 원소가 들어있는 리스트 인스턴스를 만들어 냄
    • eagerly evaluated
    • 입력이 클 경우, 메모리 상당히 낭비함
# 파일에서 읽은 x에는 새줄 문자가 들어 있으므로 길이가 눈에 보이는 길이보다 1만큼 더 길다
value = [len(x) for x in open('my_file.txt')]
print(value)

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

2. 리스트 컴프리헨션 대신 제너레이터 사용

  • 제너레이터 식을 실행해도 출력 시퀀스 전체가 실체화되지 않음
    • lazily evaluated
    • 그 대신 제너레이터 식에 들어 있는 식으로부터 원소를 하나씩 만들어내는 이터레이터 생성
  • () 사이에 리스트 컴프리헨션과 비슷한 구문을 넣어 제너레이터 식 생성 가능
  • next 내장 함수 사용하여 다음 값을 가져올 수 있음
it = (len(x) for x in open('my_file.txt'))
print(it)
print(next(it))
print(next(it))

>>>
<generator object <genexpr> at 0x108993dd0>
100
57
  • 2번째 장점
    • 두 제너레이터 식 합성 가능
roots = ((x, x**0.5) for x in it)
print(next(roots))

>>>
(15, 3.872983346207417)
  • 제너레이터를 사용하는 경우 이터레이터에 상태가 존재하므로 이터레이터를 한 번만 써아햠