본문 바로가기

TIL

[TIL] #5. sys.stdin.readline()

입력을 받는 방법


알고리즘 문제를 풀다 보면 문제에서 주어진 입력을 받아 처리해야 하는 경우가 많다. Python의 경우 입력을 받을 수 있는 방법이 대표적으로 2가지가 있는데 input()sys.stdin.readline() 이 그것이다. 보통 처음에 Python을 배울 때는 아마 대부분 input() 을 사용했을 것이다. 나도 이 글을 쓰기 전 까지는 그랬다. 그런데, input() 을 통해 입력받는 것이 속도가 느리다는 사실을 알게 되었고 알고리즘 문제를 풀 때 어떤 문제에서는 시간초과 이슈를 발생시키기도 한다는 사실을 알았다. 따라서, 이글에서는 input() 대신에 사용할 수 있는 sys.stdin.readline() 에 대해서 알아보고 둘 사이에 어떤 차이점이 있는지, 언제 어떤걸 쓰면 좋을지를 정리해보자.


input()


Python 공식 문서

공식 문서에 따르면 input() 은 (직역주의😅)

  • prompt 인자가 있으면, 개행없이 표준 출력으로 기록된다.
  • input() 으로 부터 받은 입력의 개행문자를 벗겨서(stripping) 문자열로 변환한 값을 리턴한다.
  • EOF(End of file)이 읽혀지면, EOFError를 발생시킨다.

즉, input() 에 입력을 할 때 입력값을 넣고 엔터를 치면 그 때 발생한 개행문자(\n)를 없애고 문자열로 만들어서 리턴한다. 또한, 더 이상 받을 입력이 없으면 EOFError를 출력한다.

EOF(End of file)이란?

파일의 끝을 의미하며 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없음을 나타낸다. C언어에서는 EOF는 -1이라는 상수값을 가지고 있다.




sys.stdin.readline()


일단, sys 모듈은 Python 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈이다. stdinsys 모듈안에 있는 파일 객체이고 공식문서에 따르면,

Python 공식 문서

File objects used by the interpreter for standard input

  • stdin 은 파이썬 인터프리터가 표준 입력에 사용하는 파일 객체
  • readline() 은 파일 객체의 메소드 중 하나로 read(), readlines() 와 같이 파일 객체를 읽을 때 사용한다.

즉, sys.stdin.readline()sys 라는 모듈의 파일 객체 stdin 의 메소드 중 readline() 을 사용한다는 의미이다. readline() 은 입력을 읽을 때 한 번에 한 줄씩 읽는데, 이 말은 여러 줄의 입력이 있을 때 한 줄을 읽고 나면 그 다음 줄을 가리킨다는 뜻이다.


차이점


input()sys.stdin.readline()은 정확하게는 하는 일이 다르다. python2 에서 보다는 덜 해졌지만 여전히 차이점이 존재한다. 무엇보다 input() 은 파이썬의 내장함수이고, sys.stdin 은 File objects 로 분류된다. (파일 객체라는게 정확히 어떤 의미인지는 모르겠다;;🤯)

  1. input()prompt 인자가 있는데 이로 인해 오버헤드가 발생할 수 있다.(인자값을 주지 않는 경우라도)
  2. input()은 공백을 제거하고 결과를 리턴, 반면에 sys.stdin.readline()은 공백, 개행문자등을 함께 리턴하므로 제거하기 위해서는 strip()을 써야함.sys.stdin.readline().strip() 이렇게
  3. input()은 더이상 읽을게 없으면 EOF에러를 발생시키지만, sys.stdin.readline()은 읽을게 없을때는 빈 문자열을 리턴한다. 입력초과 발생 우려가 있다.

콘솔에서 Ctrl + D 입력하면 EOF를 발생시킬 수 있다. 각각 결과가 다르게 나오는 것을 볼 수 있다.

# input() 일때, EOF발생시키면 EOFError발생
>> s = input("-->")
>> print(s)
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    s = input("-->")
EOFError
# sys.stdin.readline() 일때, 빈 문자열 리턴(에러발생 X)
>> s = sys.stdin.readline()
>> print(s)

>>

개행문자 리턴

>> s = input()
>> print(list(s))
hello
['h','e','l','l','o']
import sys

>> s = sys.stdin.readline()
>> print(list(s))
hello
['h','e','l','l','o','\n']

# strip()
>> s = sys.stdin.readline().strip()
>> print(list(s))
hello
['h','e','l','l','o']



참고자료


'TIL' 카테고리의 다른 글

[TIL] #7. Semantic Web, Semantic Tag  (0) 2021.03.16
[TIL] #6. HTTP  (0) 2021.03.14
[TIL] #4. sorted()와 sort()  (0) 2021.02.28
[TIL] #3. List Comprehension  (0) 2021.02.25
[TIL] #2. 자기소개 페이지 만들기  (0) 2021.02.21