Python

input()과 sys.stdin.readline()의 차이

JAEJUNG 2021. 7. 15. 16:47

프로그래머스에서 문제를 풀 땐 크게 느끼지 못했는데,

백준에서 알고리즘 문제를 풀면서 유독 시간 초과 때문에 틀린 적이 여러 번 있어 이를 해결하는 과정에서 사용한

함수의 차이를 기록해놓는다.

Python 2.x

두 함수의 차이를 설명하기 전에 Python 2.x 버전에 있던 raw_input()과 input() 함수를 파악해야 한다.

Python 공식 문서에선 두 함수를 아래와 같이 설명한다.

 

raw_input([prompt])

If the prompt argument is present, it is written to standard output without a trailing newline. The function then reads a line from input, converts it to a string (stripping a trailing newline), and returns that. When EOF is read, EOFError is raised. Example:

input([prompt])

Equivalent to eval(raw_input(prompt)).

This function does not catch user errors. If the input is not syntactically valid, a SyntaxError will be raised. Other exceptions may be raised if there is an error during evaluation.

간단히 말해서 raw_input()은 input 값에 대해 string 형태로 변환하고 이를 return 해주는 함수이고,

input()은 eval(raw_input())과 같은 함수이다.

예를 들어, raw_input("3+5")을 eval 함수로 감싸면 정수 8을 return 해주기 때문에 연산한 값 그대로를 얻을 수 있다는 편리함을 가지고 있다.

(eval 함수는 가독성이 떨어지고, 무엇보다 보안 상에 매우 취약한 부분이 있기 때문에 사용을 지양한다.

자세한 부분은 추후 포스팅을 통해 따로 다루도록 하겠다.)

 

Python 3.x

Python 3.x 버전으로 넘어오면서 raw_input() 함수가 사라지고 input()이 raw_input() 역할을 대신 맡게 된다.

Python 3.9 버전 docs에서 설명하는 input 함수와 sys.stdin는 아래와 같다.

 

input([prompt])

If the prompt argument is present, it is written to standard output without a trailing newline. The function then reads a line from input, converts it to a string (stripping a trailing newline), and returns that.

 

sys.stdin

stdin is used for all interactive input (including calls to input());

 

input() 함수의 설명은 2.x 버전의 raw_input()과 같기에 생략하고, sys.stdin의 경우 interactive input, 즉 input()을 포함하는 대화형 입력에 사용한다는 뜻이다.

설명만 봐서는 동일하게 입력에 사용하는 함수라는 뜻 같다.

그럼 docs에서 readline에 대한 내용을 살펴보자.

readline

The readline module defines a number of functions to facilitate completion and reading/writing of history files from the Python interpreter. This module can be used directly, or via the rlcompleter module, which supports completion of Python identifiers at the interactive prompt. Settings made using this module affect the behaviour of both the interpreter’s interactive prompt and the prompts offered by the built-in input() function.

마지막 Settings~ 설명을 보면 이 모듈을 사용하여 만든 설정은 Interpreter의 대화형 프롬프트와 input 함수에서 제공하는 프롬프트에 영향을 준다. 라고 쓰여있다.

 

input()과 sys.stdin.readline의 가장 큰 차이점은 Prompt parameter와 개행문자에 있다.

input은 prompt parameter가 있기 때문에 이로 인한 overhead가 발생할 수 있다.

또한 input은 공백을 제거한 후에 return해주고 sys.stdin.readline은 공백을 함께 return한다.

(input은 공백 제거를 위해 strip() 함수를 계속해서 호출하기 때문에 이 부분에서도 overhead 발생)

 

정리하자면 input()은

input -> rstrip() -> 문자열로 변환 -> return

의 여러 절차를 거치기 때문에 알고리즘 문제를 풀 때 시간 초과가 발생하는 경우에는

아래와 같이 선언한 후 문제를 다시 풀어보면 좋을 것 같다. 

 

'Python' 카테고리의 다른 글

'이것이 코딩테스트다'  (0) 2021.08.26
이진 탐색  (0) 2021.07.27
DFS 구현하기  (0) 2021.07.24
에라토스테네스의 체  (0) 2021.07.20