1. 제너레이터가 유리한 이유는?
리스트 컴프리헨션의 동작 방식
lines = [line.strip() for line in open('data.txt') if 'error' in line]
df = pd.DataFrame({'log': lines})
- open()은 파일 전체를 메모리에 올리진 않지만,
- 리스트 컴프리헨션이 전체 데이터를 한꺼번에 처리해서
- line.strip()된 결과 전부가 메모리에 저장됨
- 이후 DataFrame으로 복사되면서 → 한 번 더 메모리 차지
📌 최대 메모리 사용량:
≈ 원천 데이터 크기 + 리스트 객체 크기 + DataFrame 내부 복사본 크기
2. 제너레이터 방식의 동작 방식
def read_filtered_lines(filepath):
with open(filepath) as f:
for line in f:
line = line.strip()
if 'error' in line:
yield line
lines = list(read_filtered_lines('data.txt'))
df = pd.DataFrame({'log': lines})
- yield는 조건에 맞는 줄 하나만 메모리에 올린 뒤 즉시 넘김
- list(...)가 호출되기 전까지는 메모리 점유량 최소
- 리스트로 변환되면서만 최종적으로 메모리 점유
📌 최대 메모리 사용량:
≈ 조건을 통과한 줄만 담긴 리스트 + DataFrame 복사본
정리하면
| 항목 | 리스트 컴프리헨션 | 제너레이터 + list() |
| 초기 처리 단계 메모리 사용 | 전체 원천 데이터의 처리 결과 한꺼번에 저장 | 처리된 줄 하나씩만 메모리에 있음 |
| 최종 메모리 사용량 | 원천 데이터 + 리스트 + DataFrrame | 조건 통과한 줄만 리스트 +_DataFrame |
| 전체 처리 흐름 | 처음부터 끝까지 모 두 적재 -> 처리 | 한 줄씩 -> 조건 확인 -> 통과되면 적재 |
| 효율성 (대용량일수록) | X | 훨씬 우수 |
✔ 제너레이터는 처리 중에는 메모리 부담을 거의 주지 않으며,
✔ 최종적으로 필요한 데이터만 메모리에 올라옵니다.
반면,
❌ 리스트 컴프리헨션은 처리 중간에도 많은 데이터를 메모리에 올리므로,
대용량 데이터 처리에는 덜 적합합니다
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| return, break, continue, pass 그리고 finally의 관계 완벽 정리 (0) | 2025.06.22 |
|---|---|
| 파이썬 예외 처리 구문 완전 정복: try, except, else, finally (0) | 2025.06.22 |
| 제너레이터 vs 이터레이터, 쉽게 이해하기 (0) | 2025.06.22 |
| 리스트 컴프리헨션, 어디까지 써야 똑똑한 걸까? (0) | 2025.06.22 |
| 파이썬 inspect 모듈, 쉽게 이해하기 (1) | 2025.06.22 |