본문 바로가기
Tech/Coding

io.BytesIO(open(0, 'rb').read()).readline과 io.BufferedReader(io.FileIO(0), 1 << 18).readline

by redcubes 2025. 5. 3.

✅ 두 방식 비교 요약

항목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