입출력: 왜 "sys.stdin.readline()"이 "input()"보다 빠를까?

Ohback·2025년 8월 18일
0

Algorithm-Study

목록 보기
3/6

코딩 문제를 풀다보면 input()을 사용하는 것보다 sys.stdin.readline()을 사용 했을 때의 처리 시간이 빠르다는 것을 알 수 있다. 그래서 오늘은 두가지 입력의 차이를 비교하여 왜 sys.stdin.readline()input()보다 빠른가에 대해 알아보려고 한다.

출처: 8 speed differences you need to know in Python, https://medium.com/@xkumiyu

sys.stdin.readline() 구조 이해하기

[키보드/파일/파이프] → [OS fd 0: stdin]
        ↓ (버퍼링)
    [io.BufferedReader]  ← (바이너리) sys.stdin.buffer
        ↓ (디코딩, 개행 규칙)
    [io.TextIOWrapper]   ← (텍스트)   sys.stdin
        ↓
    .readline()  → "한 줄\n"

1) sys란?

  • 표준 라이브러리 모듈(설치 불필요, import sys).
  • “파이썬 실행기” 자체와 대화하는 창구:
    • sys.argv : 명령행 인자
    • sys.path : 모듈 탐색 경로
    • sys.version, sys.platform : 버전/플랫폼
    • sys.exit() : 프로그램 종료
    • sys.stdin / sys.stdout / sys.stderr : 표준 입력/출력/에러 스트림
    • sys.getrecursionlimit(), sys.getsizeof() 등 런타임 설정/정보

2) stdin이란?

  • “표준 입력(Standard Input)”을 의미하는 파일 같은 객체(텍스트 스트림).
  • 기본적으로 키보드에 연결되지만, 다음처럼 바뀔 수 있음:
    • cat data.txt | python app.pydata.txt의 내용이 stdin으로 흘러 들어옴
    • python app.py < data.txt → 리다이렉션으로 파일이 stdin이 됨
  • 파이썬에선 sys.stdinio.TextIOWrapper(문자 스트림)로 제공되고, 하위에 버퍼(io.BufferedReader)OS 파일 디스크립터가 있음.
    • 바이너리 입력이 필요하면 sys.stdin.buffer를 사용 (bytes 단위).

3) readline()이란?

  • 텍스트 스트림에서 개행 문자까지 한 줄을 읽어 문자열로 돌려주는 메서드.
  • 개행 포함이 기본(마지막 줄이 개행 없으면 없을 수도 있음).
  • EOF(End Of File)면 *빈 문자열 ''을 반환.
  • sys.stdin.readline(size=-1)
    • size를 주면 최대 그 길이만큼 읽어옴(개행 전이라도 크기 제한).

input()은 어디서 시간이 오래 걸리는 걸까?

  • 공통 경로: OS 표준입력 → 버퍼 채우기 → 텍스트 디코딩 → “줄 읽기”
  • input(): 공통 경로 +
    1. (옵션) 프롬프트 출력/flush
    2. TTY 확인 & 편집 훅(대화형이면 히스토리/편집 경유, 비대화형이면 생략)
    3. EOF를 예외로 변환(빈 문자열 대신 EOFError)
    4. 마지막 개행 제거

이처럼 sys.stdin.readline()TextIOWrapperreadline만 호출해 줄을 그대로 가져오고(개행 포함), 후처리는 사용자에게 맡긴다. 반면, input()은 공통 경로를 지나 일부 층을 추가로 거쳐야 하기에 사용자 측면에서 더 친절하지만 결과가 느릴 수 밖에 없다.

자판기 vs 카페, 비유로 쉽게 이해하기

  • sys.stdin.readline() = 자판기
    • 자판기는 버튼 누르면 음료를 그대로 뽑아준다.
      (“그대로” = 줄 전체를 개행까지 포함해 반환(추가 손질 없음)).
    • 매진이면 그냥 빈 컵(빈 문자열 '') 이라 생각하면 된다.
  • input() = 카페
    • 카페는 먼저 “무엇으로 드릴까요?”(프롬프트) 묻고, 손님이 주문을 수정할 수도 있다(라인 편집/히스토리).
    • 음료가 나오면 잔 가장자리 닦기(개행 제거) 까지 해줘서 깔끔하게 건넨다.
    • 재료가 없으면 “죄송합니다”(EOFError) 라고 알려준다.

3줄 요약

  • input()프롬프트 출력, 인터랙티브 편집(히스토리/키 바인딩), 예외 처리, 개행 제거 등 부가 로직을 더 거친다.
  • sys.stdin.readline()텍스트 스트림에서 줄 하나를 그대로 읽어 반환하는, 더 얇은 경로를 탄다.
  • 반복적으로 많이 읽을수록 작은 오버헤드 차이가 누적되어 readline()이 확연히 빨라진다.

참고

블로그(1): https://prod.velog.io/@roope97
블로그(2): https://blog.sungmin.dev

profile
기록은 기억을 지배한다.

0개의 댓글