백준 알고리즘을 풀면서
input
을 사용했는데 시간 초과란 결과를 얻었다.
input
이sys.stdin.readline
에 비해 처리 시간이 오래걸린다는데sys.stdin.readline
이 무엇인지 알아봐야겠다.
알고리즘에서
input()
을 이용할 때 종종 시간 초과가 발생하기 때문에sys 모듈
의sys.stdin.readline
을 사용하여 입력값을 받는다.
참고. Python sys.stdin과 sys.stdin.readline() - 그저그런 컴공생
sys는
파이썬 모듈
의 하나로 파이썬 인터프리터가 제공하는 변수와 함수를 제어할 수 있다.
참고. 점프 투 파이썬
stdin
은 표준 입력인데* 표준 입력, 표준 출력
은 프로그램이 실행되는 환경의 구성으로 외부 세계와 IO를 주고 받아 파일을 읽고 쓰는 방식을 의미한다.
따라서 표준입력과 출력은sys 모듈
내의stdin
,stdout
(standardIn, standardOut)으로 정의된다.* 여기서 표준 입력이란 '입력 장치를 추상화'한 것으로 어떤 입력 장치를 사용해도 데이터만 전달되면 되므로 장치는 신경쓰지 않는다고 정의 내린다. 표준 출력의 경우 콘솔 환경에서 화면에 글자가 출력되는 것을 의미한다.
# 참고
위에서 정리한 내용을 토대로 한다면
input()
,print()
를 그냥 사용하면 되지 않나? 싶지만input(),print()
와sys.stdin, sys.stdout
의 관계는 다음과 같이 정리된다.
input() 함수는 sys.stdin.readline().rstrip()과 같다.
print() 함수는 sys.stdout.write();sys.stdout.flush()와 같다.
sys.stdin은 TextIOWrapper이며 ‘r’모드와 utf8인코딩을 사용한다.
sys.stdout은 TextIOWrapper이며 ‘w’모드와 utf8 인코딩을 사용한다.
즉 sys.stdin,sys.stdout은 텍스트 파일을 연 것과 똑같이 작동한다는 것을 알 수 있고, 그 ‘파일’이 기본적으로는 키보드와 콘솔 화면에 연결된 것으로 생각할 수 있는 것이다.
참고. (Python) 데이터를 입력받는 방법을 유연하게 생각해보기 - Wireframe : 파고들기 – 표준입출력과 IO 객체
input이 호출되고 인자인 Promot 문자열을 화면에 출력 후 사용자의 입력을 받는다.
사용자가 키를 하나씩 누르면 이에 대응하는 데이터가 버퍼에 들어간다.
enter를 누르면 개행문자(\n, 줄바꿈)이 입력되고, 버퍼의 입력이 종료된 것으로 간주한다.
입력된 문자열은 해당 시스템의 콘솔 입,출력 인코딩을 사용하여 디코드되어 유니코드 문자열로 변환된다.
input() 함수는 변환된 문자열 값을 반환 하면서 종료된다.
참고. [Python] input보다 sys.stdin.readline의 처리 속도가 빠른 이유는? - green-leaves-tree
결론적으로input
보다sys.stdin
이 빠른 이유는
두 함수간의 속도차이는 Prompt 출력 여부와
한번에 읽어와 버퍼에 저장하는 sys.stdin.readline()
이 하나씩 누를 때마다 데이터를 버퍼에 보관하는 input()
보다 처리 속도가 빠르다.
즉, 버퍼의 사이즈 차이로 입력이 반복될 수록 sys.stdin.readine()
이 빠르다.
# test.py
import sys
x, y = sys.stdin.readline().split()
print("x = ", x)
print("y = ", y)
====================== RESTART: /Users/hwangbogsil/Desktop/dev/python/test.py =====================
1 2
x = 1
y = 2
>>> #자동으로 종료된다.
# test.py
import sys
for i in sys.stdin :
print(i)
====================== RESTART: /Users/hwangbogsil/Desktop/dev/python/test.py =====================
1 2 34 567 # 입력
1 2 34 567
12 34 56 # 입력
12 34 56
123 456 # 입력
123 456
>>> #사용자가 종료해야한다. (ctrl + d)
^Z
를 입력하면 종료된다는데 작동이 안되어ctrl + d
로 종료했다
참고. Python sys.stdin과 sys.stdin.readline() - 그저그런 컴공생
# test.py
import sys
nums = []
for i in sys.stdin :
nums.append(i.strip())
print(nums)
# strip() 사용 전
====================== RESTART: /Users/hwangbogsil/Desktop/dev/python/test.py =====================
1 2 3 4 5
5 4 3 2 1
['1 2 3 4 5\n', '5 4 3 2 1\n']
>>>
# strip() 사용 후
====================== RESTART: /Users/hwangbogsil/Desktop/dev/python/test.py =====================
1 2 3 4 5
5 4 3 2 1
['1 2 3 4 5', '5 4 3 2 1']
# test.py
import sys
N = int(input())
a = [sys.stdin.readline().strip() for i in range(N)]
print(a)
====================== RESTART: /Users/hwangbogsil/Desktop/dev/python/test.py =====================
3
1
2
3
['1', '2', '3']
# 참고
# 참고
TextIOWrapper