최근 데이터를 다루는 일이 잦아지면서, 파이썬의 리스트와 제너레이터에 대해 깊이 생각하게 되었습니다.
특히 대용량 데이터를 처리할 때 메모리 사용량은 매우 중요한 고려 사항입니다.
오늘은 리스트와 제너레이터의 차이점, 그 중에서도 메모리 사용량에 초점을 맞춰 자세히 알아보겠습니다.
리스트와 제너레이터, 무엇이 다를까?
리스트와 제너레이터는 모두 순회 가능한 객체를 생성하는 데 사용되지만, 핵심적인 차이점이 존재합니다.
리스트는 모든 요소를 메모리에 저장하는 반면, 제너레이터는 필요할 때마다 요소를 생성(yield)하여 반환합니다.
이러한 차이점은 메모리 사용량에 직접적인 영향을 미칩니다.
리스트 컴프리헨션은 `[ ]` 괄호를 사용하는 반면, 제너레이터 표현식은 `( )` 괄호를 사용하여 표현한다는 점도 기억해 두면 좋습니다.
제너레이터의 핵심: 느긋한 계산법(Lazy Evaluation)
제너레이터는 "느긋한 계산법(Lazy evaluation)"을 사용합니다.
이는 값을 미리 계산하여 저장하는 것이 아니라, 필요할 때마다 계산한다는 의미입니다.
예를 들어, 1부터 100만까지의 숫자를 리스트에 저장하려면 막대한 메모리가 필요하지만, 제너레이터를 사용하면 메모리 부담을 크게 줄일 수 있습니다.
제너레이터는 현재 순서의 값만 메모리에 유지하고, 다음 값을 요청받을 때 계산하여 제공하기 때문입니다.
메모리 사용량 비교: 리스트 vs 제너레이터
리스트는 데이터의 크기에 비례하여 메모리 사용량이 증가합니다.
반면, 제너레이터는 데이터 크기와 상관없이 거의 일정한 메모리 사용량을 유지합니다.
이는 제너레이터가 값을 미리 저장하지 않고, 필요할 때마다 생성하기 때문입니다.
따라서 대용량 데이터를 처리할 때는 리스트보다 제너레이터를 사용하는 것이 메모리 효율성 측면에서 훨씬 유리합니다.
특히, 최근에는 데이터의 양이 기하급수적으로 증가하는 추세이므로, 제너레이터의 중요성은 더욱 커지고 있습니다.
yield 문의 활용
제너레이터는 `return` 대신 `yield` 문을 사용하여 값을 반환합니다.
`yield`는 함수의 실행을 일시 중단하고 값을 반환하며, 다음 호출 시 중단된 지점부터 다시 실행을 이어갑니다.
이러한 메커니즘 덕분에 제너레이터는 모든 값을 한 번에 메모리에 로드하지 않고도 순회 가능한 객체를 만들 수 있습니다.
`yield`는 제너레이터의 핵심적인 기능이며, 메모리 효율성을 높이는 데 중요한 역할을 합니다.
언제 제너레이터를 사용해야 할까?
제너레이터는 다음과 같은 상황에서 유용하게 활용될 수 있습니다.
* 대용량 데이터를 처리해야 할 때
* 메모리 사용량을 최소화해야 할 때
* 데이터를 한 번만 순회하면 될 때
* 무한한 데이터 스트림을 생성해야 할 때
예를 들어, 파일에서 한 줄씩 읽어 처리하는 경우, 제너레이터를 사용하여 파일을 한 번에 메모리에 로드하지 않고도 효율적으로 처리할 수 있습니다.
또한, 복잡한 계산을 수행하는 경우, 제너레이터를 사용하여 계산 결과를 필요할 때마다 생성하여 메모리 사용량을 줄일 수 있습니다.
결론:
요약하자면, 리스트는 모든 요소를 메모리에 저장하는 반면, 제너레이터는 필요할 때마다 요소를 생성합니다.
따라서 대용량 데이터를 처리하거나 메모리 사용량을 최소화해야 할 때는 제너레이터를 사용하는 것이 효율적입니다.
제너레이터의 "느긋한 계산법"과 `yield` 문을 잘 활용하면, 메모리 효율적인 코드를 작성할 수 있습니다.
프로젝트의 특성과 데이터의 규모를 고려하여 리스트와 제너레이터를 적절히 선택하는 것이 중요하며, 상황에 맞는 최적의 자료구조를 선택하는 것이 개발 효율성을 높이는 현명한 방법입니다.
'개발' 카테고리의 다른 글
| lambda 함수, 쓰지 말라는 사람도 많은 이유 (0) | 2026.01.31 |
|---|---|
| 이터레이터(iterator)와 iterable 완전 정리 (0) | 2026.01.31 |
| 파이썬의 모든 것은 객체다, 진짜일까? (0) | 2026.01.31 |
| 파이썬 오버라이딩(Overriding)을 잘못 쓰면 생기는 문제 (0) | 2026.01.31 |
| 파이썬 상속(Inheritance)은 언제 쓰는 게 좋을까? (0) | 2026.01.31 |