본문 바로가기
Tech/Coding

Python 고속 입력 처리법

by redcubes 2025. 4. 11.

🧵 Python 고속 입력 처리법:
io.BufferedReader(io.FileIO(0), 1 << 18).readline은 왜 빠를까?

Python으로 알고리즘 문제를 풀 때 input()이나 sys.stdin.readline()이 너무 느려서 시간 초과가 나는 경우가 있다.
그럴 때 등장하는 구문이 바로 아래 코드다.

import io
input = io.BufferedReader(io.FileIO(0), 1 << 18).readline

이 구문은 무려 최대 10배 이상 빠른 입력 처리가 가능하다.
왜 이렇게 빠른지 아래에서 구조와 원리를 상세히 설명한다.


🧠 Python 표준 입력은 어떻게 동작할까?

Python의 입력은 보통 다음처럼 동작한다:

  • input(): 한 줄 읽고 문자열 반환
  • sys.stdin.readline(): 조금 더 빠르게 문자열 반환

이 방식들은 내부적으로:

  1. 운영체제의 stdin에서 한 줄 읽음
  2. UTF-8 디코딩
  3. Python 문자열 객체로 변환

→ 매우 고수준 처리라서 속도가 느릴 수 있다.


⚡ 고속 입력 처리의 핵심: BufferedReader + FileIO

BufferedReader(io.FileIO(0), 1 << 18)는 다음처럼 작동한다:

  • FileIO(0): 운영체제의 표준입력(파일 디스크립터 0)을 직접 염
  • BufferedReader(..., 1 << 18): 256KB 버퍼에 한 번에 대량 읽기
  • .readline(): 버퍼에서 빠르게 한 줄 반환

📊 성능 비교 표

입력 방식 설명 I/O 오버헤드 디코딩 속도
input() 기본 파이썬 입력 높음 있음 ❌ 느림
sys.stdin.readline() 중간 수준 보통 있음 ⏳ 보통
BufferedReader(FileIO(...)) 저수준 + 대용량 버퍼 매우 낮음 없음 ✅ 매우 빠름

🧬 입력 처리 구조 다이어그램

📎 일반 입력 구조 (input())

[ 운영체제 stdin ]
        ↓ (한 줄씩 읽음)
[ Python 해석기: 디코딩 & 객체 생성 ]
        ↓
  사용자 코드(input())

🚀 고속 입력 구조 (BufferedReader(FileIO(...)))

[ 운영체제 stdin (fd 0) ]
        ↓
[ FileIO - 저수준 접근 ]
        ↓
[ BufferedReader (256KB 버퍼)]
        ↓
사용자 코드 (readline 호출)

✅ 예제 코드

import io
input = io.BufferedReader(io.FileIO(0), 1 << 18).readline

n = int(input())
for _ in range(n):
    data = list(map(int, input().split()))

→ 대량의 숫자 입력에서도 시간 초과 없이 안정적으로 처리 가능


📌 언제 써야 할까?

  • 입력 데이터가 수십만~수백만 줄일 때
  • 백준/코딩 테스트에서 시간제한이 빡빡할 때
  • sys.stdin.readline마저 느릴 때

✅ 결론

BufferedReader(FileIO(0), 1<<18)은 운영체제 레벨의 입력을 한 번에 많이 읽어 버퍼에 저장하고,

readline()을 통해 빠르게 줄 단위로 꺼내 쓰는 고속 입력 방식이다.

💡 요약 한 줄:
BufferedReader + FileIO는 stdin을 대용량으로 미리 받아
파이썬이 빠르게 소비할 수 있게 해주는 초고속 입력 전략이다.