예에에에에전에 백준 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()이 먹힌다.
'Coding > Python' 카테고리의 다른 글
Wordcloud with FLASK-뼈대 대공사 (0) | 2022.08.22 |
---|---|
대형프로젝트 계획중 (0) | 2022.08.22 |
Python으로 JSON파일 읽기 (0) | 2022.08.22 |
재귀함수가 돌아가는 방식을 알아보자 (0) | 2022.08.22 |
감마 함수+팩토리얼 코드에서 유리수 처리 (0) | 2022.08.22 |