파이썬으로 백준 문제를 풀어본 사람이라면 가끔씩 많은 입력을 받는 문제를 풀 때 시간과 발생한 적이 있을 것이다.
이럴 때 input
대신 sys.stdin.readline
을 사용하면 시간이 초과되지 않는다.
과연 이것은 무엇이길래 입력받는 속도를 향상할 수 있는 걸까? 답을 찾기 위해 우선 input
과 sys.stdin.readline
의 동작에 대해서 알아보도록 하자.
input
공식 문서에 따르면, 1input
함수는:
1. 입력으로 들어오는 한 줄을 읽고,
2. 문자열로 변환하고,
3. 개행 문자를 제거한 뒤,
4. 값을 반환하는 형식으로 동작한다고 한다.
입력 하나를 받는데 4단계의 과정을 거치는 것이다.
sys.stdin.readline
우선 sys
와 stdin
의 의미를 알아보도록 하자.
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
을 이렇게 설명하고 있다.
stdin
는 모든 대화식 입력에 사용됩니다 (input()
호출을 포함합니다);
이 줄을 봤을 때 sys.stdin
과 input
은 같은 것 아닌가 하는 사람이 있을 것이다. 그러나 이걸 보자.
저기서 말하는 stdin
은 표준 입력 스트림을 의미하는 것이지, sys.stdin
을 의미하는 것이 아니다. input
또한 키보드로 입력을 받기 때문에 표준 입력 스트림을 사용한다.
input
함수는 내장 함수(built-in function)로, 입력으로 들어오는 한 줄을 읽고, 문자열로 변환하여, 개행 문자를 지우고, 값을 반환한다. 그러나 sys.stdin은
파일 객체(file object)이다. sys.stdin
입력은 파일 객체로 취급되어, readline
함수로 파일의 첫 번째 줄만 읽어 반환한다. 줄을 반환하기에 개행 문자(\n)가 제거되지 않는다.
즉, 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
- (영어 버전을 원하면 url에서 ko를 지우면 된다) [본문으로]
'Programming Language > Python' 카테고리의 다른 글
[Python] 1_000은 도대체 뭘까 (0) | 2022.06.14 |
---|---|
[Python] 리스트 복사하기 (일차원 & 다차원) (0) | 2022.03.25 |
[Python] 삼항 연산자 (0) | 2021.10.22 |
[Python] 사칙연산 연산자 (0) | 2021.10.22 |
[Python] dictionary / 프로그래머스 숫자 문자열과 영단어 (0) | 2021.10.12 |
댓글