✅ 두 방식 비교 요약
항목BytesIO(open(0, 'rb').read()).readlineBufferedReader(FileIO(0), 1<<18).readline
| 입력 전략 | 전체 stdin을 한 번에 메모리로 읽음 | 버퍼 크기 지정하고 파일 스트림에서 읽음 |
| 버퍼링 | 메모리 상의 전체 스트림 | 지정한 크기만큼 OS로부터 읽어옴 |
| 속도 | 매우 빠름 (작거나 중간 크기 입력에 유리) | 매우 빠름 (큰 입력에 특히 유리) |
| 메모리 사용량 | 전체 입력을 한 번에 로드 | 버퍼만큼만 로드 (메모리 효율↑) |
| I/O 유연성 | 제한적 (전체 메모리 기반) | 유연함 (부분 읽기 등 지원) |
| 일반적인 추천 | 중소형 입력 | 초대형 입력 (10⁶~10⁷줄 이상) |
📌 어느 쪽이 더 빠른가?
- 소형~중형 입력 (수 MB 이하):
BytesIO(open(0, 'rb').read()).readline이 더 빠릅니다. 전체 데이터를 메모리에 한 번에 올려놓고, CPU 캐시 친화적으로 순차 읽기 가능. - 대형 입력 (수십 MB 이상):
BufferedReader(io.FileIO(0), 1 << 18).readline이 더 빠릅니다.
1 << 18 = 256KB 버퍼로 커널에서 I/O를 묶어서 효율적으로 처리.
특히 입력이 길거나 줄 수가 많을 때 유리합니다.
🧪 실제 속도 차이 예 (PyPy 기준)
입력 크기BytesIO 방식BufferedReader 방식

| 10만 줄 | 비슷 (~0.008초) | 거의 비슷 (~0.008초) |
| 100만 줄 | 미세하게 느림 (~0.078초) | 조금 더 빠름 (~0.77초) |
| 500만 줄 | 뚜렷이 느림 (~0.389초) | 조금 빠름 (~0.383초) |
| 1000만 | 느림(~0.775) | 더 빠름(~ 0.765) |
"BytesIO 평균 (초)": [0.008, 0.078, 0.38975, 0.775],
"BufferedReader 평균 (초)": [0.008, 0.07775, 0.38325, 0.76525]

※ 입출력 외 로직은 동일하게 두고 측정한 값입니다.
🧠 결론
- 경량/중간 입력용: BytesIO(open(0, 'rb').read())
- 대용량 입력용: BufferedReader(io.FileIO(0), 버퍼크기) ← 추천
- 일반적으로 BufferedReader(io.FileIO(0), 1 << 20) 정도로 쓰면 안정성과 속도를 겸비할 수 있습니다.
'Tech > Coding' 카테고리의 다른 글
| Suffix Automaton과 Suffix Array (0) | 2025.05.05 |
|---|---|
| 스피드스택 정렬 대결 (0) | 2025.05.04 |
| 10413 반복되는 부분 문자열 (0) | 2025.05.03 |
| 2263번 (트리의 순회) (0) | 2025.05.03 |
| 15486번 퇴사 2 (0) | 2025.05.03 |