barcode

input vs sys.stdin.readline()

Coding/Python

예에에에에전에 백준 18108번 풀이를 올렸을 때 댓글로 질문이 하나 왔었다. 

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

백준에서 빠르다고 해서 쓰고 있었음... 아니 농담 아니고 진짜다. 반복문 이런거 잘못 짜면 응애 나 애기시간초과! 가 반기는데 다른데서라도 시간 줄여야져... 


일단 둘 다 입력 받을 때 쓰는 게 맞다. 

input()
#input

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

각각 이렇게 쓰면 된다. 근데 이렇게만 해 두면 왜 쟤가 빠른지 체감이 잘 안 올 것이다. 

 

우리가 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()

그러니까 이렇게 써야 개행 문자를 떼고 입력을 받는다. 정확히 말하자면 rstrip()은 개행문자를 떼 주고, strip()은 공백을 떼버린다.

 

즉, sys.stdin.readline()이 빠른 이유는

1. 개행문자를 안 떼고

2. 프롬프트 메시지도 안 받기 때문

이라고 할 수 있다.

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