[pandas] read_excel(): calamine & openpyxl
포스트
취소

[pandas] read_excel(): calamine & openpyxl

Python 데이터 파이프라인에서 Excel 파일을 읽는 작업은 생각보다 병목이 되기 쉽습니다. 특히 수십만~수백만 셀 규모의 .xlsx 파일을 처리할 때는 엔진 선택이 성능을 크게 좌우합니다.

pandas 2.2+부터 calamine 엔진이 추가되면서, 기존의 openpyxl 엔진과 비교해 속도 중심 vs 호환성 중심의 선택지가 생겼습니다.

이 글에서는 다음을 정리합니다.

  • calamine vs openpyxl의 구조적 차이
  • 보고된 성능 차이
  • 실제 장단점
  • pandas vs polars 비교

Excel Reader Engine 구조

Excel을 읽는 과정은 크게 다음 단계로 구성됩니다.

1
2
3
4
5
6
7
8
9
10
11
Excel file (.xlsx)
        │
        ▼
[Excel parsing engine]
  - openpyxl
  - calamine
        │
        ▼
DataFrame 생성
  - pandas
  - polars

openpyxl vs calamine 구조적 차이

openpyxl

특징

  • Python으로 구현된 Excel 파서
  • Workbook / Worksheet / Cell 객체 모델 기반

동작 방식

1
2
3
4
5
6
7
8
9
Excel file
   ↓
zip 해제
   ↓
xml parsing
   ↓
Cell 객체 생성
   ↓
Python loop로 DataFrame 변환

문제점

  • 셀 단위 Python 객체 생성
  • Python iteration overhead
  • 대규모 Excel에서 성능 저하
  • 지원 포맷
    • xlsx
    • xlsm

강점

  • Excel 기능 호환성: 스타일, 수식, 서식 처리
  • 안정성
  • 디버깅: 에러 메시지가 명확함

calamine

특징

  • Rust 기반 Excel 파서
  • Python binding (python-calamine, fastexcel)

동작 방식

1
2
3
4
5
6
7
Excel file
   ↓
Rust parser
   ↓
columnar data extraction
   ↓
DataFrame 생성

강점

  • parsing loop가 Rust에서 실행
  • Python object 생성 최소화
  • 메모리 사용량 감소
  • 다양한 포맷 지원: xls, xlsx, xlsm, xlsb, ods

약점

  • 타입 추론 차이: datetime 타입 차이, timedelta 표현 차이, mixed type 컬럼 추론 차이
  • Excel 기능 지원 한계: 수식 처리, 병합 셀 처리 같은 기능은 openpyxl이 더 안정적

실제 보고된 성능 차이

pandas 2.2 릴리즈 노트에서는 다음과 같은 내용이 명시되어 있습니다.

  • calamine은 여러 벤치마크에서 openpyxl 대비 최대 약 5배 빠른 사례 존재
  • 특히 대형 Excel 전체 로딩에서 성능 차이가 큼

하지만 예외도 있습니다.

  • 대형 Excel에서 상위 몇 행만 읽는 경우
  • openpyxl 또는 pyxlsb가 더 빠를 수 있음

이는 openpyxl의 lazy iteration 특성 때문입니다.


결론

Excel을 빠르게 읽고 싶다면 calamine, Excel을 정확하게 해석하고 싶다면 openpyxl.


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.