input vs sys.stdin.readline()

예전에 네이버 블로그에 백준 풀이(18108번)를 올렸다가 이런 질문을 받은 적 있었다.

input()대신 sys.stdin.realine()을 쓰는 이유를 알 수 있나요?

걔가 더 빨라요. 이게 풀다보면 응애 나 애기시간초과! 가 반기는 경우도 있고 해서 걍 저거 씁니다. 


입력을 받을 때 각각

input()
#input

import sys
sys.stdin.readline()
#sys.stdin.readline()

이렇게 쓴다. 근데 sys어쩌고는 두줄인데 쟤가 더 빠르다고요? 이렇게만 쓰면 저게 그래서 왜 빠른지 체감이 안된다. 우리가 input()을 저렇게 쓰는 게 아니라

input('메시지를 입력해주세요')

보통 이런 식으로 쓰는데, 저 안에 있는 텍스트를 프롬프르 메시지라고 한다. 그럼 sys.stdin.readline()도 프롬프트 메시지가 있나요? 놉. 이게 sys.stdin.readline()이 input()보다 빠른 이유 중 하나다. 예? 그거 말고 이유가 또 있어요? 예 있습니다. (대충 스펀지 전문가 짤)

파이썬에서는 입력을 받을 때 개행 문자(\n)가 같이 딸려온다. input()은 개행 문자를 떼버리는데 sys.stdin.readline()은 개행문자를 안 떼고 그냥 받는다. 그래서 sys.stdin.readline()으로 받고 나면 항상 rstrip()이나 strip() 메소드가 따라와야 한다.

a = sys.stdin.readline().rstrip() 
a = sys.stdin.readline().strip()

그러니까 sys.stdin.readline()은 이렇게 써 줘야 개행문자를 뗀다. 정확히 말하자면 rstrip()은 개행문자를 떼 주고, strip()은 공백을 떼버린다. 그러니까 두 줄로 요약하자면

  1. sys.stdin.readline()은 개행 문자도 안 떼고
  2. input()과 달리 프롬프트 메시지도 없어서 빠르다

이렇게 된다.

참고로 일부 IDE나 에디터에서 sys.stdin.readline()은 안먹으니 시간이 정말 급한거다 잘못하면 응애 나 애기시간초과! 가 반긴다 이런거 아님 걍 인풋 쓰자. 대표적인 예로 Jupyter에서는 sys.stdin.readline()이 입력을 안 받고(그냥 안받음) Spyder에서는 형변환 에러가 뜬다. 급하면 그냥 런던올림픽 펜싱심판 데려오자 아니 그냥 파이참을 쓰세요 파이참은 안해봤는데 VScode는 sys.stdin.readline()이 먹힌다.