1. sys.stdin.readline() 함수란?
- sys.stdin.readline() 함수는 sys 모듈에서 제공하는 함수로, 표준 입력 스트림(stdin)에서 한 줄씩 데이터를 읽어오는 역할을 합니다. 이 함수는 주로 파일 입력과 같은 고급 입출력 작업에서 사용되며, 특히 대용량 데이터를 처리할 때 성능적으로 유리합니다.
2. 주요 특징과 사용방법
- 여기서 몇 가지 주요 특징과 사용 방법을 설명하겠습니다.
2-1. 모듈 임포트:
- sys.stdin.readline() 함수를 사용하기 위해서는 sys 모듈을 먼저 임포트해야 합니다.
import sys
2-2. 입력 읽기:
- sys.stdin.readline() 함수를 호출하면 표준 입력에서 한 줄의 데이터를 읽어옵니다. 이때, 개행 문자(\n)를 포함한 문자열을 반환합니다.
line = sys.stdin.readline()
2-3. 입력 끝 검사:
- sys.stdin.readline()은 사용자 입력이 없을 때(EOF, End of File)에도 블로킹되지 않고 빈 문자열('')을 반환합니다. 따라서 입력의 끝을 검사하려면 반환된 문자열이 비어 있는지 확인해야 합니다.
line = sys.stdin.readline()
if not line:
# 입력의 끝에 도달했을 때 처리할 코드
2-4. 개행 문자 처리:
- sys.stdin.readline() 함수로 읽어온 문자열에는 개행 문자(\n)가 포함되므로, 필요한 경우 개행 문자를 제거하려면 strip() 메서드나 rstrip() 메서드를 사용합니다.
line = sys.stdin.readline().strip() # 개행 문자 제거
3. 성능면에서 더 우수한 이유
- sys.stdin.readline() 함수가 input() 함수보다 성능면에서 더 우수한 이유는 입출력 버퍼링과 관련이 있습니다. 여기에서 성능 차이의 주요 이유를 설명하겠습니다:
3-1. 입출력 버퍼링:
- input(): input() 함수는 사용자가 입력할 때마다 입력 버퍼를 flush하고 키보드 입력을 읽어옵니다. 이는 사용자가 입력할 때마다 입출력 동작이 발생하므로 작은 입력에 대해서는 큰 문제가 되지 않지만, 대용량 입력을 처리할 때는 매우 비효율적입니다.
- sys.stdin.readline(): sys.stdin.readline() 함수는 파일 스트림을 사용하며, 파일 스트림은 보통 입력을 버퍼링하여 한 번에 여러 문자를 읽어옵니다. 이로 인해 입출력 동작이 더 효율적으로 수행됩니다. 따라서 대용량 입력을 처리할 때 더 빠릅니다.
3-2. 문자열 처리:
- input(): input() 함수는 입력 문자열을 반환할 때 항상 문자열을 생성합니다. 이는 문자열을 반환할 때마다 메모리 할당 및 해제 작업이 발생하므로 반복적인 입력 처리 시 성능에 영향을 줄 수 있습니다.
- sys.stdin.readline(): sys.stdin.readline() 함수는 문자열을 반환할 때마다 메모리를 새로 할당하지 않습니다. 대신, 입력 데이터를 버퍼에 담아 반환하므로 문자열 생성과 관련된 오버헤드가 적습니다.
4. 결론
- 요약하면, sys.stdin.readline() 함수는 버퍼링을 활용하여 대용량 입력 처리 및 입출력 효율성에서 input() 함수보다 성능이 우수합니다. 하지만 일반적인 상호작용형 입력에는 input() 함수가 더 편리하며, 성능 차이가 크게 나타나는 경우는 대량의 입력을 처리해야 할 때나 입출력 성능이 중요한 상황입니다.
++ 아래 예제처럼 override하여 좀더 간단히 사용가능하다
import sys
input = sys.stdin.readline
n = input()