파이썬/기초 프로그래밍

리스트 컴프리헨션과 제너레이터의 메모리 사용 차이!

Data Jun 2025. 6. 22. 15:05

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 훨씬 우수

 

 

✔ 제너레이터는 처리 중에는 메모리 부담을 거의 주지 않으며,
✔ 최종적으로 필요한 데이터만 메모리에 올라옵니다.

 

 

반면,

 

❌ 리스트 컴프리헨션은 처리 중간에도 많은 데이터를 메모리에 올리므로,

대용량 데이터 처리에는 덜 적합합니다