코딩 문제를 풀다보면 input()
을 사용하는 것보다 sys.stdin.readline()
을 사용 했을 때의 처리 시간이 빠르다는 것을 알 수 있다. 그래서 오늘은 두가지 입력의 차이를 비교하여 왜 sys.stdin.readline()
이 input()
보다 빠른가에 대해 알아보려고 한다.
[키보드/파일/파이프] → [OS fd 0: stdin]
↓ (버퍼링)
[io.BufferedReader] ← (바이너리) sys.stdin.buffer
↓ (디코딩, 개행 규칙)
[io.TextIOWrapper] ← (텍스트) sys.stdin
↓
.readline() → "한 줄\n"
sys
란?import sys
).sys.argv
: 명령행 인자sys.path
: 모듈 탐색 경로sys.version
, sys.platform
: 버전/플랫폼sys.exit()
: 프로그램 종료sys.stdin
/ sys.stdout
/ sys.stderr
: 표준 입력/출력/에러 스트림sys.getrecursionlimit()
, sys.getsizeof()
등 런타임 설정/정보stdin
이란?cat data.txt | python app.py
→ data.txt
의 내용이 stdin
으로 흘러 들어옴python app.py < data.txt
→ 리다이렉션으로 파일이 stdin
이 됨sys.stdin
이 io.TextIOWrapper
(문자 스트림)로 제공되고, 하위에 버퍼(io.BufferedReader
)와 OS 파일 디스크립터가 있음.sys.stdin.buffer
를 사용 (bytes
단위).readline()
이란?''
을 반환.sys.stdin.readline(size=-1)
size
를 주면 최대 그 길이만큼 읽어옴(개행 전이라도 크기 제한).input()
은 어디서 시간이 오래 걸리는 걸까?input()
: 공통 경로 +EOFError
)이처럼 sys.stdin.readline()
은 TextIOWrapper의 readline
만 호출해 줄을 그대로 가져오고(개행 포함), 후처리는 사용자에게 맡긴다. 반면, input()
은 공통 경로를 지나 일부 층을 추가로 거쳐야 하기에 사용자 측면에서 더 친절하지만 결과가 느릴 수 밖에 없다.
sys.stdin.readline()
= 자판기input()
= 카페input()
은 프롬프트 출력, 인터랙티브 편집(히스토리/키 바인딩), 예외 처리, 개행 제거 등 부가 로직을 더 거친다.sys.stdin.readline()
은 텍스트 스트림에서 줄 하나를 그대로 읽어 반환하는, 더 얇은 경로를 탄다.readline()
이 확연히 빨라진다.블로그(1): https://prod.velog.io/@roope97
블로그(2): https://blog.sungmin.dev