일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- os.path
- r-string
- CI/CD
- 쿼리
- boto3
- 생각
- sort(reverse=True) v.s. reverse
- timestamp
- Airflow
- blinker
- [초급(예비) 개발자 오픈소스 실무 역량강화 교육]
- slicing [::-1]
- ds_store
- 고차함수
- OS
- selenium-wire
- 순수함수
- reverse v.s. reversed
- sort v.s. sorted
- decorator
- pandas
- 코딩 테스트
- functools.wraps
- 함수형 프로그래밍
- PIP
- S3
- Python
- Today
- Total
공부일지
[코딩 테스트]입력방식 비교 - sys.stdin.readline() v.s. open(0).read().splitlines() 본문
[코딩 테스트]입력방식 비교 - sys.stdin.readline() v.s. open(0).read().splitlines()
이르리의 공부일지 2025. 4. 25. 14:06배경
문제 푸는데 sys 이용한 입력이 open()이용한 입력보다 더 빨라서 의문이었다.
왜냐하면 코테 고수들은 open을 주로 쓰길래 그리고 open이 빠르다고 해서
입력을 여러 줄 받을 때는 만능 방식이라고 생각했다.
python에서 입력하는 방법은 여러가지인데
그 중에 내장모듈 sys 를 이용한 방법과 내장함수 open()을 이용한 방법이 있다.
둘 다 많이 쓰이는 방법이다.
무엇이 어떤 상황에서 더 나은지 알아보자.
내장모듈 sys 이용한 입력
import sys
input = sys.stdin.readline
n = int(input())
nums = [int(input()) for _ in range(n)]
- 한 줄씩 바로바로 처리됨
- 버퍼가 존재하고 입력 스트림이 연결된 상태에서 직접 읽음
- 지연 없이 라인 단위로 처리
- sys.stdin은 C언어 레벨에서 최적화된 fgets() 비슷한 처리 방식
내장함수 open()을 이용한 입력
lines = open(0).read().splitlines()
n = int(lines[0])
nums = list(map(int, lines[1:]))
- 전체 입력을 한 번에 다 읽고
- splitlines()로 한 줄씩 나눔
- 내부적으로 문자열 처리 과정이 많이 포함됨
- splitlines()는 줄 끝 문자 제거, 줄 나누기 등을
-> 추가로 수행입력이 아주 많을 경우 오히려 느림
-> 특히 list(map(...)) 부분에서 한꺼번에 메모리 할당하느라 시간 더 걸릴 수 있음
c.f.
open(0): 입력
open(1): 출력
open 방식이 효율적인 경우
1. 입력을 "한 번에 다 읽고", 여러 번 순회하거나 후처리할 때
lines = open(0).read().splitlines()
for line in lines:
...
# 또 다른 for문에서 lines 재사용
2. 정규표현식, 문자열 전처리를 한꺼번에 적용할 때
import re
data = open(0).read()
matches = re.findall(r'\d+', data)
3. 테스트 입력을 복사/붙여넣기 할 때
- 파일 입력을 스크립트 내에서 테스트하려는 경우
- sys.stdin보다 open('input.txt').read()가 더 직관적이고 짧음
4. 매우 작고 고정된 입력일 때
- 입력 줄 수가 적고, 라인마다 처리 부담이 없다면
- 한 번에 읽는 방식이 효율성 손실 없이 코드 간결성 확보 가능
물론 open()도 메소드 read() - splitlines(), 메소드 readlines() 등 쓰는 법은 다양하다.
그 중 여러 줄 입력에 가장 적합한게
read().splitlines()(결과: 스트링 요소를 원소로 하는 리스트)라고 생각했는데문제에 따라서, 풀이 방식에 따라서 효율적인 방식이 다르다는 걸 알게 됐다.
결론
여러 줄 입력받아서 메모리에 넣어두고 계속 쓰는 게 아니라면,
코테에서는 웬만하면 sys.stdin.readline 쓰는 게 적당!
참고링크
Python 내장함수 - open()
https://docs.python.org/ko/3.13/library/functions.html
Built-in Functions
The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order.,,,, Built-in Functions,,, A, abs(), aiter(), all(), a...
docs.python.org
'Computer > 공부정리' 카테고리의 다른 글
[컴퓨터 그래픽스]Liang-Barsky 선분 클리핑 (0) | 2025.05.03 |
---|---|
[컴퓨터 그래픽스]Cohen-Sutherland 선분 클리핑 (0) | 2025.05.03 |
[Python]sys.argv 활용으로 main 함수와 test 함수 분리해서 쓰기 (1) | 2025.04.23 |
[AI]ChatGPT memory, reference Chat History, Archive chats에 관한 내용 (0) | 2025.04.17 |
[AI][강의 요약]1강 - 생성 AI와 프롬프트 엔지니어링 (0) | 2025.04.17 |