파이썬으로 데이터를 처리할 때 최종 결과를 Excel로 내보내는 경우가 많습니다. 이때 pandas의 ExcelWriter는 필수 도구이지만, xlsxwriter와 openpyxl 엔진 중 어떤 것을 선택해야 할지 고민될 수 있습니다. 본 분석은 실제 성능 테스트와 기술적 특성을 비교하여 각 엔진의 적합한 사용 사례를 제시합니다.
1. 설계 철학 비교: 전문화 vs 범용성
두 엔진의 근본적인 차이는 설계 목표에서 비롯됩니다. xlsxwriter는 쓰기 전용 엔진으로, 대용량 데이터 출력에 최적화되었습니다. 읽기 기능을 배제함으로써 메모리 관리와 쓰기 속도를 극대화하며, Excel 파일을 스트리밍 방식으로 생성합니다.
반면 openpyxl은 읽기/쓰기/수정이 모두 가능한 범용 엔진입니다. Excel의 전체 객체 모델(통합문서, 시트, 셀)을 메모리에 로드하여 세부적인 편집이 가능하지만, 이로 인해 리소스 소비가 증가합니다.
# xlsxwriter: 고성능 쓰기 예시
import pandas as pd
df_large = pd.DataFrame({'값': range(100000)})
with pd.ExcelWriter('대용량_파일.xlsx', engine='xlsxwriter') as 출력기:
df_large.to_excel(출력기, sheet_name='데이터')
통합문서 = 출력기.book
시트 = 출력기.sheets['데이터']
차트 = 통합문서.add_chart({'type': 'column'})
차트.add_series({'values': '=데이터!$B$2:$B$100001'})
시트.insert_chart('D2', 차트)
# openpyxl: 파일 수정 예시
from openpyxl import load_workbook
from openpyxl.styles import Font
기존_문서 = load_workbook('수정전_파일.xlsx')
작업시트 = 기존_문서.active
작업시트['A1'].value = '업데이트 값'
작업시트['A1'].font = Font(bold=True)
기존_문서.save('수정완료.xlsx')
2. 성능 벤치마크: 데이터 규모에 따른 차이
1만 행에서 100만 행까지 5개 열(정수, 실수, 문자열, 날짜, 불리언)로 구성된 데이터셋을 사용해 쓰기 성능을 측정했습니다. 테스트 환경은 Python 3.9, 16GB RAM, SSD 저장장치에서 5회 반복 측정 중앙값을 채택했습니다.
import pandas as pd
import numpy as np
import time
def 테스트_데이터_생성(행_수):
return pd.DataFrame({
'식별자': np.arange(1, 행_수+1),
'측정값': np.random.randn(행_수) * 100,
'분류': np.random.choice(['X', 'Y', 'Z'], 행_수),
'날짜': pd.date_range('2023-01-01', periods=행_수, freq='T'),
'상태': np.random.choice([True, False], 행_수)
})
def 쓰기_성능측정(엔진, 데이터, 파일명):
시작시간 = time.perf_counter()
with pd.ExcelWriter(파일명, engine=엔진) as 기록기:
데이터.to_excel(기록기, index=False)
return time.perf_counter() - 시작시간
다음은 대규모 데이터 처리 시 관찰된 주요 성능 차이입니다: