-
[Python Tip#1] input()보다 sys.stdin.readline()의 처리속도가 더 빠르다.Programming 기초/Coding Test 2023. 6. 11. 02:02
*버퍼(buffer)
- 표준 입출력 함수를 사용할 때, 버퍼(buffer)라는 임시 메모리 공간을 사용한다.
- 이전 포스팅 참고(https://operationcoding.tistory.com/34)
* input()
- input()은 한 줄을 입력 받고 문자열로 변환한다.
- 입력 마지막의 줄바꿈(\n)은 포함하지 않는다.
- 한 글자 누를 때마다 바로바로 데이터가 버퍼에 보관된다. 개행문자(\n)가 입력되면 버퍼의 입력이 종료된 것으로 간주.
- input() 호출 시 프롬프트 문자열을 화면에 출력해 사용자의 입력을 기다림. 대량의 입력을 받는 경우 받고 다시 프롬프트 창을 띄우고의 과정을 반복하므로 오류 발생 가능성이 증가한다.
- 더 이상 받을 입력이 없을 때 수행될 경우 EOF(End of File) error를 일으킨다.
* sys.stdin.readline()
- import sys 로 모듈을 불러와서 사용한다.
- sys는 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈이다.
- stdin은 standard input의 약자이다.
- sys.stdin.readline()은 개행문자(\n)를 포함한 사용자의 입력을 문자열로 변환한다.
- 입력 크기에 제한을 줄 수 있다. 한번에 읽어들일 문자의 수를 정할 수 있다.
- sys.stdin은 file object이다. 사용자의 입력만을 받는 buffer를 만들어 그 buffer에서 읽어들인다.
- sys.stdin.readline()은 입력이 종료되면 데이터를 한번에 읽어와 버퍼에 보관한다. 때문에 한 문자마다 바로 버퍼로 이동시키는 input()보다 처리속도가 빠르다.
- 단,sys.stdin.readline()입력의 마지막에 줄바꿈(\n)을 제거하기 위해 strip()하는 경우(sys.stdin.readline().strip())에는 input()보다 처리속도가 느리다.
- 더 이상 받을 입력이 없을 때 수행될 경우 빈 문자열을 반환한다.
* 결론
sys.stdin.readline()은 input()과 다르게 개행문자(\n)을 제거하는 과정이 없고, 문자를 모두 입력받은 뒤에 한 번에 버퍼에 보관하므로 입력이 길어질수록 input()보다 더 속도가 빠르다. (입력이 길어질수록 sys.stdin.readline()를 사용하는 것이 속도면에서 더 유리하다.)
* 백준 문제 예시
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
각 테스트 케이스마다 A+B를 출력한다.
import sys T = int(input()) for i in range(T): A, B = map(int, sys.stdin.readline().split()) print(A+B)
# 백준 고수의 소스코드 import sys input() for i in sys.stdin: c = sum(map(int, i.split())) print(c)
* 백준(10951번 A+B-4 문제)
# ctrl+z를 입력받기 전까지 무한 입력 import sys for x in sys.stdin: a, b = map(int, x.split()) print(a + b)
* 백준(10810번 공 넣기 문제)
input=sys.stdin.readline 으로 두면 사용이 편하다. 끝에 ()을 붙이지 않도록 주의하자
import sys input = sys.stdin.readline n, m = map(int, input().split()) basket = [0] * n for i in range(m): a, b, c = map(int, input().split()) for i in range(a - 1, b): basket[i] = c for i in range(n): print(basket[i], end=" ")
아래 소스코드는 위 문제에서 참고하기 좋은 팁 두 가지를 담고 있다.
1. 괄호없이 한줄에 리스트 요소를 출력하는 방법
2. 헷갈리지 않기 위해 리스트 인덱스 0을 사용하지 않는 것
# 어느 고수의 답변 n,m = map(int, input().split()) s = [0]*(n+1) for _ in range(m): i,j,k = map(int, input().split()) for x in range(i,j+1): s[x] = k print(*s[1:])
* 참고
https://100s.tistory.com/5?category=1018059
'Programming 기초 > Coding Test' 카테고리의 다른 글
[BOJ#10807번] count(), list(map(int,input().split())) (0) 2023.06.17 [이코테 # 다이나믹 프로그래밍1] 설명 및 메모이제이션 (0) 2023.06.13 [이코테 # 정렬2] 기본 정렬 라이브러리를 활용한 문제들 (0) 2023.06.09 [이코테 # 정렬1] 정렬 소스코드, 선택/삽입/퀵/계수 정렬, sorted()와 sort()의 차이 (0) 2023.06.09 [이코테 # DFS/BFS 2] 음료수 얼려 먹기(DFS), 미로탈출(BFS) (0) 2023.06.07