ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python Tip#1] input()보다 sys.stdin.readline()의 처리속도가 더 빠르다.
    Programming 기초/Coding Test 2023. 6. 11. 02:02

    *버퍼(buffer)

     

    * 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 

    https://blog.sungmin.dev/102

     

    댓글

Designed by Tistory.