input과 sys.stdin.readline
백준 파이썬 문제를 풀다가 분명 제대로 푼 거 같은데 시간 초과 문제가 발생한 경우가 있어서 고민하다가 도저히 모르겠어서 검색을 해보았는데 sys.stdin.readline를 사용하면 시간 초과 오류를 줄일 수 있다는 해답을 알게 되었다.
결론적으로 input() 보다 sys.stdin.readline()를 사용하면 시간을 줄일 수 있다는 결과 값은 얻었는데 왜 시간을 줄일 수 있는지에 대한 정확한 해답과 정확한 사용방법에 대해서 궁금해져서 찾아보았다.
💡 input()과 sys.stdin.readline() 사용법
우선 input()의 경우는 파이썬을 처음 공부할 때부터 접해왔던 코드라 무언가 값을 입력받을 때 input()을 이용하여 특별한 조건 없이 입력을 받아 오고 있었다.
하지만 sys.stdin.readline()의 경우는 조금 다르다 sys.stdin.readline()는 'sys'라는 라이브러리 안에 포함되어 있기 때문에 사용할 때 항상 import를 해주어야 한다.
여기까지만 들었을 때에는 출력 결과도 차이가 없는 것 같고 sys.stdin.readline()의 경우는 'sys'라는 라이브러리를 import까지 해서 사용해야 하기 때문에 귀찮은 거 아닌가 생각을 하였다.
💡 차이점
- 파이썬 공식 문서에 따르면 -
input()은 'prompt인자가 있을 경우 끝에 개행 문자를 붙이지 않고 표준 출력에 쓴다. 그 후 함수는 입력을 통해 한 줄을 읽고, 문자열로 변환하여(그 이후 줄 바꿈을 제거) 값을 반환한다'라고 적혀 있고
sys.stdin는 'stdin은 모든 대화형 입력에 사용된다.( input() 호출을 포함 )'이라고 나와 있다. 결론적으로 input()과 같은 동작을 한다는 것을 의미한다.
그럼 readline()은 무슨 의미를 가지고 있을까?
readline()는 'readline 모듈은 파이썬 인터프리터에서 히스토리 파일의 완성 및 읽기/쓰기를 용이하게 하기 위해 많은 함수를 정의합니다. 이 모듈은 직접 사용하거나 대화식 프롬프트에서 Python 식별자 완성을 지원하는 rlcompleter 모듈을 통해 사용할 수 있습니다. 이 모듈을 사용하여 만든 설정은 인터프리터의 대화형 프롬프트와 내장 input() 함수에서 제공하는 프롬프트의 동작에 영향을 줍니다.'라고 명시되어 있다.
솔직히 말하면 처음 들었을 때는 무슨 소리인지 하나도 이해가 가지 않았는데 쉽게 이야기하면 input()은 사용자에게 입력받은 값을 문자열로 변환하고 줄 바꿈을 제거하고 값을 변환하여주는 것이고 sys.stdin은 input()과 똑같은 동작을 하지만 sys.stdin.readline()은 다르다고 볼 수 있다.
sys.stdin.readline()은 입력받은 값을 매개변수로 받지 않고 텍스트의 한 줄이 끝남을 표시하는 문자로 받는다는 것이다.
💡 sys.stdin.readline()의 장점
1. input()의 중간 과정이 생략됨으로써 속도가 빠르다.
🚫 주의 사항
sys.stdin.readline()가 input() 보다 처리속도가 빠르면 항상 sys.stdin.readline()를 사용해서 입력을 받으면
되는 건가??
import sys
a = sys.stdin.readline()
❌ )
sys.stdin.readline()를 사용하면 한 줄 단위로 입력받기 때문에, 개행 문자가 같이 입력받아진다.
예를 들어서 5를 입력받는 가정을 한다면 5\n 이 저장되기 때문에, 개행 문자인 (5\n)을 제거해주는 일이생긴다. 또한 sys.stdin.readline()의 경우는 변수의 타입이 문자열의 형태로 (str)로 저장되기 때문에 만약 입력 값을 정수형으로 사용하기 위해서 int로 받는다면 형 변환을 한번 더 해야 하기 때문에 비 효율적이다.
💡 sys.stdin.readline()의 올바른 사용 방법
- 반복문이나 여러 줄을 입력받아야 할 경우 sys.stdin.readline()를 사용하면 시간이 단축된다.
💯 여러 개의 정수를 한 줄에 입력받을 때
import sys
a,b,c = map(int,sys.stdin.readline().split())
💯 임의의 개수의 정수를 한 줄에 입력받아 리스트에 저장할 때
import sys
data = list(map(int,sys.stdin.readline().split()))
💯 임의의 개수의 정수를 n 줄 입력받아 2차원 리스트에 저장할 때
import sys
data = []
n = int(sys.stdin.readline())
for i in range(n):
data.append(list(map(int,sys.stdin.readline().split())))
💯 문자열 n 줄을 입력받아 리스트에 저장할 때
import sys
n = int(sys.stdin.readline())
data = [sys.stdin.readline().strip() for i in range(n)]
'Python > 기타' 카테고리의 다른 글
[pyenv] MacOs에서 pyenv를 이용한 파이썬 버전 관리 (0) | 2024.06.05 |
---|---|
Python의 __init__ 과 self의 이해 (0) | 2023.10.16 |
[Python] 파이썬 가상 환경 만들기, 설정, 명령어 정리 (0) | 2022.11.09 |
[Python] 메모리 초과, 메모리 줄이기 (0) | 2022.10.21 |
input과 sys.stdin.readline
백준 파이썬 문제를 풀다가 분명 제대로 푼 거 같은데 시간 초과 문제가 발생한 경우가 있어서 고민하다가 도저히 모르겠어서 검색을 해보았는데 sys.stdin.readline를 사용하면 시간 초과 오류를 줄일 수 있다는 해답을 알게 되었다.
결론적으로 input() 보다 sys.stdin.readline()를 사용하면 시간을 줄일 수 있다는 결과 값은 얻었는데 왜 시간을 줄일 수 있는지에 대한 정확한 해답과 정확한 사용방법에 대해서 궁금해져서 찾아보았다.
💡 input()과 sys.stdin.readline() 사용법
우선 input()의 경우는 파이썬을 처음 공부할 때부터 접해왔던 코드라 무언가 값을 입력받을 때 input()을 이용하여 특별한 조건 없이 입력을 받아 오고 있었다.
하지만 sys.stdin.readline()의 경우는 조금 다르다 sys.stdin.readline()는 'sys'라는 라이브러리 안에 포함되어 있기 때문에 사용할 때 항상 import를 해주어야 한다.
여기까지만 들었을 때에는 출력 결과도 차이가 없는 것 같고 sys.stdin.readline()의 경우는 'sys'라는 라이브러리를 import까지 해서 사용해야 하기 때문에 귀찮은 거 아닌가 생각을 하였다.
💡 차이점
- 파이썬 공식 문서에 따르면 -
input()은 'prompt인자가 있을 경우 끝에 개행 문자를 붙이지 않고 표준 출력에 쓴다. 그 후 함수는 입력을 통해 한 줄을 읽고, 문자열로 변환하여(그 이후 줄 바꿈을 제거) 값을 반환한다'라고 적혀 있고
sys.stdin는 'stdin은 모든 대화형 입력에 사용된다.( input() 호출을 포함 )'이라고 나와 있다. 결론적으로 input()과 같은 동작을 한다는 것을 의미한다.
그럼 readline()은 무슨 의미를 가지고 있을까?
readline()는 'readline 모듈은 파이썬 인터프리터에서 히스토리 파일의 완성 및 읽기/쓰기를 용이하게 하기 위해 많은 함수를 정의합니다. 이 모듈은 직접 사용하거나 대화식 프롬프트에서 Python 식별자 완성을 지원하는 rlcompleter 모듈을 통해 사용할 수 있습니다. 이 모듈을 사용하여 만든 설정은 인터프리터의 대화형 프롬프트와 내장 input() 함수에서 제공하는 프롬프트의 동작에 영향을 줍니다.'라고 명시되어 있다.
솔직히 말하면 처음 들었을 때는 무슨 소리인지 하나도 이해가 가지 않았는데 쉽게 이야기하면 input()은 사용자에게 입력받은 값을 문자열로 변환하고 줄 바꿈을 제거하고 값을 변환하여주는 것이고 sys.stdin은 input()과 똑같은 동작을 하지만 sys.stdin.readline()은 다르다고 볼 수 있다.
sys.stdin.readline()은 입력받은 값을 매개변수로 받지 않고 텍스트의 한 줄이 끝남을 표시하는 문자로 받는다는 것이다.
💡 sys.stdin.readline()의 장점
1. input()의 중간 과정이 생략됨으로써 속도가 빠르다.
🚫 주의 사항
sys.stdin.readline()가 input() 보다 처리속도가 빠르면 항상 sys.stdin.readline()를 사용해서 입력을 받으면
되는 건가??
import sys
a = sys.stdin.readline()
❌ )
sys.stdin.readline()를 사용하면 한 줄 단위로 입력받기 때문에, 개행 문자가 같이 입력받아진다.
예를 들어서 5를 입력받는 가정을 한다면 5\n 이 저장되기 때문에, 개행 문자인 (5\n)을 제거해주는 일이생긴다. 또한 sys.stdin.readline()의 경우는 변수의 타입이 문자열의 형태로 (str)로 저장되기 때문에 만약 입력 값을 정수형으로 사용하기 위해서 int로 받는다면 형 변환을 한번 더 해야 하기 때문에 비 효율적이다.
💡 sys.stdin.readline()의 올바른 사용 방법
- 반복문이나 여러 줄을 입력받아야 할 경우 sys.stdin.readline()를 사용하면 시간이 단축된다.
💯 여러 개의 정수를 한 줄에 입력받을 때
import sys
a,b,c = map(int,sys.stdin.readline().split())
💯 임의의 개수의 정수를 한 줄에 입력받아 리스트에 저장할 때
import sys
data = list(map(int,sys.stdin.readline().split()))
💯 임의의 개수의 정수를 n 줄 입력받아 2차원 리스트에 저장할 때
import sys
data = []
n = int(sys.stdin.readline())
for i in range(n):
data.append(list(map(int,sys.stdin.readline().split())))
💯 문자열 n 줄을 입력받아 리스트에 저장할 때
import sys
n = int(sys.stdin.readline())
data = [sys.stdin.readline().strip() for i in range(n)]
'Python > 기타' 카테고리의 다른 글
[pyenv] MacOs에서 pyenv를 이용한 파이썬 버전 관리 (0) | 2024.06.05 |
---|---|
Python의 __init__ 과 self의 이해 (0) | 2023.10.16 |
[Python] 파이썬 가상 환경 만들기, 설정, 명령어 정리 (0) | 2022.11.09 |
[Python] 메모리 초과, 메모리 줄이기 (0) | 2022.10.21 |