Python 입력: input() vs sys.stdin.readline()

영선·2024년 10월 27일

Python

목록 보기
3/4

파이썬에서 입력을 받기 위한 방법은 여러가지가 있지만, 그 중 input()과 sys.stdin.readline()에 대해 알아보고자 합니다.

1. input()
파이썬에서 가장 일반적인 사용자 입력 방식으로, 입력을 받을 때마다 문자열 형태로 반환합니다. 주로 간단한 사용자 입력을 받을 때 사용됩니다.

  • 사용 방식: 프롬프트를 통해 입력받은 내용을 변수에 저장합니다.
name = input("Enter your name: ")
print(f"Hello, {name}!")
  • 작동 방식 : input()은 표준 입력을 통해 한 줄의 입력을 받아 문자열로 반환합니다. 이때 사용자가 엔터 키를 누를 때까지 입력을 기다리며, 입력이 완료되면 줄 바꿈 문자는 자동으로 제거된 상태로 반환됩니다. 만약 예외적인 상황이 발생할 경우(Ctrl+D 또는 Ctrl+C), EOFError나 KeyboardInterrupt 예외가 발생하여 입력 처리가 중단될 수 있습니다.

  • 장점: 코드가 간단하고 직관적이며, 단일 입력에 적합합니다.

  • 단점: 속도가 느려서 대량 입력을 받는 반복문에서는 비효율적입니다.

  • 속도가 느린이유는?

  1. 입력 처리 시 표준 입출력 버퍼 관리
    기본적으로 표준 입력을 통해 데이터를 받아옵니다. 이 과정에서 sys.stdin.readline()보다 상대적으로 많은 버퍼 관리 작업이 필요합니다.
  2. 예외 처리 및 입력 검증
    input()은 다양한 예외 상황(예: EOFError, KeyboardInterrupt 등)을 고려하며 실행됩니다. 이러한 예외 처리가 input()의 속도를 조금 더 느리게 만듭니다.
    또한, input()은 자동으로 문자열로 입력을 반환해 주는데, 이 변환 과정에서도 약간의 처리 비용이 발생합니다.
  3. 프롬프트 출력
    input() 함수는 프롬프트를 출력하고 대기하는 기능이 포함되어 있어, 그만큼 처리 속도가 느려질 수 있습니다. sys.stdin.readline()은 프롬프트 없이 입력을 단순히 받기 때문에 이 부분에서 속도 차이가 발생합니다.
  4. 고수준 함수로 설계된 입력 방식
    input()은 사용자 친화적인 고수준 함수로 설계되어 있어, 다양한 상황에서의 입력 처리와 오류 관리, 문자열 변환을 포함합니다. 하지만 이런 높은 수준의 기능들이 추가적인 오버헤드를 발생시키고, 결국 sys.stdin.readline()에 비해 속도가 느려지게 됩니다.

    입력 처리 버퍼 관리와 예외 처리 및 자동 문자열 변환이 결합되어 input()은 속도가 다소 느려지는 반면, sys.stdin.readline()은 단순히 입력만 빠르게 처리하는 저수준 방식이므로 더 빠릅니다. 따라서, 반복적으로 입력을 받을 때 이런 차이가 누적되어 sys.stdin.readline()이 더 효율적입니다.

2. sys.stdin.readline()
파이썬의 sys 모듈에 포함된 함수로, 표준 입력 스트림에서 한 줄씩 데이터를 읽어오는 저수준 입력 방식입니다. 대량의 입력을 빠르게 처리해야 할 때 유용하며, 특히 반복문과 함께 사용하면 효율적으로 입력을 받을 수 있습니다.

  • 사용 방식: sys.stdin.readline()은 sys 모듈을 임포트한 후 사용합니다.
import sys
data = sys.stdin.readline()
print(data)
  • 작동 방식: 표준 입력에서 한 줄을 읽어와 반환합니다. input()과 달리 줄 바꿈 문자(\n)가 포함된 채로 반환하기 때문에, 필요 시 rstrip() 메서드를 통해 제거해야 합니다.
  • 장점: 속도가 빨라 대량 입력을 받는 반복문에서는 효율적입니다. 또한, EOF(파일 끝)에 도달하면 빈 문자열을 반환하므로, 반복문에서 종료 조건으로 활용하기 편리합니다. 파일을 읽어들이는 방식과 비슷하게 작동하므로, 파일 기반 데이터 처리에 익숙하다면 sys.stdin.readline()도 쉽게 사용할 수 있습니다.
  • 단점: 줄 바꿈 문자(\n)를 포함한 채로 반환하기 때문에, 줄 바꿈을 제거하려면 추가로 rstrip()을 사용해야 합니다. 이로 인해 코드가 약간 더 복잡해질 수 있습니다. input()처럼 프롬프트를 제공하지 않으므로, 사용자 친화적인 입력이 필요할 때는 부적합합니다. input()과 달리 sys.stdin.readline()은 기본적인 예외 처리 기능이 없습니다. 따라서 입력 도중 발생할 수 있는 오류를 별도로 처리해주어야 합니다.
항목input()sys.stdin.readline()
사용 목적표준 입력에서 한 줄을 입력받음표준 입력에서 한 줄을 입력받음
반환값문자열(입력 끝에 개행문자 제거됨)문자열(입력 끝에 개행문자 포함됨)
속도느림(입력마다 내부 처리가 더 많음)빠름(파일처럼 동작하여 속도 우위)
개행문자 처리자동으로 개행문자를 제거개행문자를 포함하여 반환
용도일반적인 입력 처리에 적합대량 입력 처리나 속도가 중요한 경우 적합
사용 가능 여부기본적으로 사용 가능import sys를 통해 sys 모듈을 가져와야 함

0개의 댓글