‘요청에 따라’ 또는 게으른 계산은 처리되는 데이터의 양이 증가함에 따라 인기를 끌게 되었습니다. 파이썬에서는 이러한 메커니즘이 표준 라이브러리에서 제너레이터와 반복자를 통해 구현되었고, 이후 itertools 함수와 요청에 따라 한 요소씩 반환할 수 있는 클래스들을 통해 발전하였습니다. 이것은 메모리에 모든 데이터를 한 번에 저장하는 것을 피할 수 있습니다.
일반적인 컬렉션 구성은 결과 전체를 메모리에 로드해야 합니다. 데이터 양이 클 경우 프로그램이 '중단'되거나 매우 느리게 작동할 수 있습니다. 데이터 스트림을 처리할 수 있는 능력이 중요합니다. 예를 들어, 수 기가바이트의 파일이나 API 요청 결과 등을 말합니다.
지연 계산은 필요할 때 요소를 가져올 수 있게 해줍니다. 파이썬에서는 제너레이터, yield 구문, 제너레이터 표현식, map, filter, zip 함수 및 itertools 모듈을 사용하여 이를 쉽게 구현할 수 있습니다. 이러한 접근 방식은 반복자 프로토콜에 기반합니다.
코드 예:
def huge_sequence(): for i in range(1, 10**9): yield i * i for val in huge_sequence(): if val > 100: break print(val)
주요 특징:
파이썬의 제너레이터가 항상 메모리를 절약하나요?
답변: 아니요, 데이터가 단계 간에 실제로 중간 저장을 필요로 하지 않을 경우에만 그렇습니다. 예를 들어, list comprehensions와 같은 일부 구조는 전체 리스트를 즉시 생성하고, 제너레이터는 요청 시에만 생성합니다. 중간 결과가 여전히 필요하다면 절약이 사라집니다.
예:
squares = (x**2 for x in range(10**8)) # 게으르게, 경제적 result = list(squares) # 즉시 모든 메모리를 소모함
map과 filter가 항상 리스트를 반환한다고 맞나요?
아니요, 파이썬 3에서 map과 filter는 리스트가 아닌 반복기를 반환합니다(게으른 제너레이터), 이는 메모리를 절약하고 데이터를 ‘실시간’으로 처리할 수 있게 해줍니다.
제너레이터를 여러 번 반복할 수 있습니까?
아니요, 제너레이터는 전체 반복 후에 ‘소모’됩니다. 반복 처리가 필요할 경우, 새로운 제너레이터를 생성하거나 반복 가능 항목을 사용해야 합니다.
개발자가 큰 로그 파일을 처리하려고 하여 이를 문자열 리스트로 메모리에 로드함.
장점:
단점:
제너레이터를 사용하여 파일을 한 줄씩 읽고 각 줄을 받을 때마다 처리함.
장점:
단점: