본문 바로가기
Programming Language/Python

[Python] input과 sys.stdin.readline의 차이

by veggie-garden 2021. 12. 10.

파이썬으로 백준 문제를 풀어본 사람이라면 가끔씩 많은 입력을 받는 문제를 풀 때 시간과 발생한 적이 있을 것이다. 

 

이럴 때 input 대신 sys.stdin.readline을 사용하면 시간이 초과되지 않는다.

 

과연 이것은 무엇이길래 입력받는 속도를 향상할 수 있는 걸까? 답을 찾기 위해 우선 inputsys.stdin.readline의 동작에 대해서 알아보도록 하자. 

 

input

input을 설명하는 python 공식 문서 이미지

공식 문서[각주:1]에 따르면, input 함수는:

1. 입력으로 들어오는 한 줄을 읽고,

2. 문자열로 변환하고,

3. 개행 문자를 제거한 뒤,

4. 값을 반환하는 형식으로 동작한다고 한다. 

 

입력 하나를 받는데 4단계의 과정을 거치는 것이다.

sys.stdin.readline

우선 sysstdin의 의미를 알아보도록 하자.

sys

sys는 시스템 특정 파라미터와 함수를 관리하는 모듈인데, 공식문서에 따르면:

이 모듈은 인터프리터에 의해 사용되거나 유지되는 일부 변수와 인터프리터와 강하게 상호 작용하는 함수에 대한 액세스를 제공합니다.

라고 한다. 간단하게 말하자면, 파이썬 인터프리터를 제어할 수 있는 방법들을 제공해 준다는 의미이다. 

인터프리터 스크린샷
이걸 인터프리터라 한다.

입력을 받는 것도 인터프리터로 이루어지니 우리는 왜 sys 모듈을 사용하는지 알았다.

 

공식 문서를 보면 알겠지만, sys 모듈 안에 인터프리터를 제어할 수 있는 수많은 방법들이 있다. sys를 통해 인터프리터를 종료시킬 수도 있고 (sys.exit), '>>>' 표시를 변경할 수도 있다 (sys.ps1).

 

stdin

컴퓨터가 입력받는 방법은 여러 가지이다. 우선 대표적으로 키보드나 모니터로 입력받을 수도 있고, 파일에 저장되어 있는 데이터를 받을 수도 있다. 이 중 키보드나 모니터로 입력받는 것을 표준 스트림, 즉 Standard Streams이라고 부른다. 표준 스트림은 세 가지 종류가 있는데, 입력을 위한 스트림(Standard Input, STDIN, 0), 출력을 위한 스트림(Standard Output, STDOUT, 1), 오류 메시지를 출력하기 위한 스트림(Standard Error, STDERR, 2)이 있다.

표준 스트림이 무엇인지 보여주는 이미지

이렇듯, 우리는 우리도 모르는 사이에 표준 스트림을 사용하고 있는 것이다. 그럼 키보드로 입력받는 것이 stdin이라는 것을 알았으니, 이제 sys.stdin.readline의 동작 방식을 알아보자. 

 

sys.stdin.readline

파이썬 공식 문서sys.stdin을 이렇게 설명하고 있다.

 

sys.stdin을 설명하는 공식 문서 이미지

 

stdin는 모든 대화식 입력에 사용됩니다 (input() 호출을 포함합니다);

 

이 줄을 봤을 때 sys.stdininput은 같은 것 아닌가 하는 사람이 있을 것이다. 그러나 이걸 보자.

 

input 함수는 내장 함수라는 것을 보여주는 이미지

 

sys.stdin.readline 함수는 모듈 함수라는 것을 보여주는 이미지

 

저기서 말하는 stdin은 표준 입력 스트림을 의미하는 것이지, sys.stdin을 의미하는 것이 아니다. input또한 키보드로 입력을 받기 때문에 표준 입력 스트림을 사용한다.

 

input 함수는 내장 함수(built-in function)로, 입력으로 들어오는 한 줄을 읽고, 문자열로 변환하여, 개행 문자를 지우고, 값을 반환한다. 그러나 sys.stdin은 파일 객체(file object)이다. sys.stdin 입력은 파일 객체로 취급되어, readline 함수로 파일의 첫 번째 줄만 읽어 반환한다. 줄을 반환하기에 개행 문자(\n)가 제거되지 않는다. 

 

input()과 sys.stdin.readline의 반환값이 모두 문자열이라는 것을 보여주는 이미지
input과 sys.stdin.readline의 반환값 모두 문자열이다.

 

 즉, input을 사용하면 함수가 돌아가지만, sys.stdin을 사용해서 들어온 입력은 파일 객체로 취급된다는 것이다.

 

읽고 변환하고 지우고 반환하는 것과, 파일 객체를 만들어 파일에 첫 번째 줄만 반환하는 것은 입력이 적다면 수행 시간에서 그리 큰 차이가 나지 않는다. 그러나 다량의 입력이 들어오면 4번의 단계를 거치는 input과, 2번의 단계를 거치는 sys.stdin.readline의 차이가 드러난다. 그래서 많은 입력이 들어올 때 sys.stdin.readline을 사용하는 것이다.

 


참고:

 

1. https://developeryuseon.tistory.com/90

 

[Python] input()과 sys.stdin()

sys.stdin 알고리즘 문제를 풀 때, 파이썬의 input() 은 실행시간이 느려서 자주 시간초과가 난다. 이럴때 sys 모듈의 stdin 을 사용하면 더 빠르게 input이 가능하다.. 고 하는데, 나는 input 과 sys.stdin 의

developeryuseon.tistory.com

2. http://tcpschool.com/python/function_fileIO

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com


 

  1. (영어 버전을 원하면 url에서 ko를 지우면 된다) [본문으로]

댓글