파이썬 입력 방식 정리 python input summary

2024. 1. 26. 17:00·파이썬 Python

서론

 알고리즘 문제들을 풀다보면 특히, 백준의 경우에는 다른 플랫폼은 solution함수를 작성하는 것과 달리 문제 테스트 케이스들의 입력값을 직접 받아서 활용하고, 다시 출력할 수 있어야 하는 main 함수를 작성해야한다. 그러다 보면 자연스럽게 python 언어에서는 input 함수와 같이 입력을 받을 함수와 print 함수와 같이 출력을 진행하는 함수가 있다.

 하지만 가끔 고인물(?)들을 보면 성능 향상을 위해선지 os나 sys의 패키지의 함수를 활용하여 입출력을 진행하는 경우가 많다. 이 포스트에서는 이런 파이썬의 입력을 적재적소에 사용할 수 있도록 정리해보고자 한다.

파이썬을 다룬 기간은 좀 됐다고 생각했는데 이런 방식은 처음 봤다

입력 Input

input()
# input(promt)
>>> s = input('--> ')  
--> Monty Python's Flying Circus
>>> s  
"Monty Python's Flying Circus"

 

 

공식 문서에 의하면, input 함수는 아래와 같이 작동한다.

  1. promt를 출력하고
  2. 개행문자 '\n'을 붙이지 않고
  3. 문자열로 변환해서 (return)돌려준다.

Python 입출력에 대해서 사용자에게 입력에 대한 안내를 우선 출력하고, 그 후에 사용자의 입력을 받아서 이를 문자열로 변환한다. 따라서 직관적으로 생각하면 이 함수를 통해서 출력 1번, 입력 1번, Type casting까지 총 3가지 과정이 일어났음을 확인할 수 있다. 

 

sys.stdin.readline()
  • sys모듈

시스템 특정 파라미터와 함수 이 모듈은 인터프리터에 의해 사용되거나 유지되는 일부 변수와 인터프리터와 강하게 상호 작용하는 함수에 대한 액세스를 제공합니다.  - 공식문서

 

기본적으로 Python 내장함수들에 활용되는 함수들에 접근할 수 있다고 생각하면 좋겠다.

그 중에서도 stdin에 대한 내용을 확인하면 아래와 같이 설명한다.

  • stdin는 모든 대화식 입력에 사용됩니다 (input() 호출을 포함합니다);
  • stdout은 print()와 표현식 문장의 출력과 input()의 프롬프트에 사용됩니다;
  • 인터프리터 자신의 프롬프트와 에러 메시지는 stderr로 갑니다.

여기 설명을 통해서 input 함수가 상대적으로 느린 이유에 대해서 확인할 수 있다. 내부적으로는 최소 2번의 함수가 따로 실행되는 형태이다.

sys.stdin.readline은 개행문자('\n')까지를 1줄로 인식하여 문자열 타입으로 반환한다. 이 경우에는 input함수와 다르게 반환되는 문자열에 개행문자가 포함되어 있으므로 필요에 따라 지워줄 필요가 있다.(rstrip, strip 함수) 아래는 사용 예시이다.

import sys

s = sys.stdin.readline()
>>> this is test
s
>>> 'this is test\n'
# separate each word
s = list(s.rstrip().split())
s
>>> ['this', 'is', 'test']

 

os.read(fd, n)

이 함수의 경우에는 저수준 입출력을 위한 함수이며, 지정된 fd(file descriptor)에서 n만큼의 바이트를 읽어오는 과정을 수행한다.

표준 입력은 fd=0이므로 이를 활용해서 함수를 사용하면 아래와 같이 입력값을 받을 수 있다.

# 표준 입출력(stdin)으로 1억 바이트를 입력받고, 개행문자를 기준으로 나눠서 각각의 입력을 int로 type cast
map(int,os.read(0, 100000000).split('\n'))
# utf-8 디코딩 적용 버전
map(int,os.read(0, 100000000).decode('utf-8').split('\n'))

여기서 주목해야할 점은 입력이 바이트로 받아지기 때문에, 영어가 아닌 한국어와 같이 utf-8 디코딩이 필요한 부분은 직접 적용이 필요한 점이다. 추가로, 사용자 입력을 받는 상황에서는 괜찮겠지만, 파일을 입력 받는다면 EOF 예외 처리를 통해서 파일 읽기 과정을 다뤄야 한다.

os.read는 입력에 대해서 직접 구현해야할 요소가 많은 대신에 세부적인 영역까지 조절할 수 있어서 성능 측면에서도 효율적일 수 있다.

 

정리

  • 속도(평균적인 상황, 최적화가 잘 진행됐을 경우)
    • os.read >= sys.stdin.readline >> input

추천으로는 보통 sys.stdin.readline으로도 충분한 성능이 나오기 때문에, 세부적인 시간 조절이 생명인 상황이라면 그때 os.read함수를 활용하여 성능을 개선하는 것이 바람직하지 않을까 싶다.

 

아래 링크는 백준 사이트에서 비교한 입력 속도를 비교한 글이다. 물론 Python 인터프리터에 따라서 각 함수의 성능도 다소 차이가 있을 수 있으니 이를 참고해서 여러분의 빠르고 성공적인 입력이 이뤄지길 바란다.

 

https://www.acmicpc.net/blog/view/56

 

입력 속도 비교

여러가지 언어와 입력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일

www.acmicpc.net

 

'파이썬 Python' 카테고리의 다른 글

[코테] 그리디(Greedy, 탐욕법) - 백준 11399 ATM, 1931 회의실 배정, 1744 수 묶기  (0) 2024.02.14
'파이썬 Python' 카테고리의 다른 글
  • [코테] 그리디(Greedy, 탐욕법) - 백준 11399 ATM, 1931 회의실 배정, 1744 수 묶기
덕소역
덕소역
(덕소 맛집이긴 하지만)실제 음식점과는 관련이 없고, 개발 관련 공부글을 적습니다.
  • 덕소역
    덕소할매순대국
    덕소역
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 파이썬 Python
      • 자바스크립트 JavaScript
      • 데이터베이스 DB
      • 서버리스 Serverless
      • 백엔드 Backend
      • 인프라 Infra
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    fastapi
    S3
    Layer
    search engine
    Lambda
    IAM
    jwt
    serverless
    boto3
    벡엔드
    db
    Infra
    kibana
    그리디
    stdin
    sshd
    24.04
    백엔드
    aks
    greedy
    elasticsearch
    Dashboard
    PYTHON
    database
    ReadLine
    사진 게시물
    서비스 기획
    기술 선정
    탐욕법
    terraform
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
덕소역
파이썬 입력 방식 정리 python input summary
상단으로

티스토리툴바