반응형

파이썬으로 알고리즘을 풀다 보면 우리는 흔히 input을 사용하여 대부분 입력을 받고, print를 통해 출력을 한다. 근데, 입출력에 대한 데이터가 많을 경우에는 속도 이슈가 발생하여 백준에서도 문제를 많이 틀린다. 이럴 때 빠른 입출력을 받기 위해 사용하는 것이 sys 모듈을 사용한다. 이번 글에서는 sys 모듈을 활용한 빠른 입출력에 대해 작성한다.


1. sys.stdin.readline

파이썬에서 빠른 입력을 받을 때 우리는 sys.stdin.readline을 사용한다. input도 있는데 sys.stdin.readline을 사용하는 이유는 한 번의 경우에는 상관이 없지만, 반복문으로 값을 입력받을 경우에는 속도가 느려 시간 초과가 발생할 수 있다. 사용하는 방법은 아래와 같다.

import sys

print(sys.stdin.readline())

 

import sys
input = sys.stdin.readline

N = int(input())

 

위의 코드에서도 완벽하게 입력값을 받으려면 아래와 같이 rstrip()을 사용하여 줄바꿈 개행문자를 없애줘야 한다.

import sys
input = sys.stdin.readline

N = list(input())
M = list(input().rstrip())

print(N)
print(M)

 

위의 코드를 실행하면 아래와 같이, 개행 문자가 포함이 되기 때문에, 리스트로 입력을 했을 때 리스트 크기가 더 커지거나 값을 제대로 가져오지 못하는 문제가 발생한다.

 

즉, input()과 sys.stdin.readline의 큰 차이점은 한 번에 데이터를 읽어와서 버퍼에 저장하냐, 매번 데이터를 읽어서 버퍼에 저장하냐의 차이다. 즉, input()보다 sys.stdin.readline이 처리 속도가 더 빠르다.

 

2. sys.stdout.write

파이썬에서 빠른 출력을 할 때는 sys.stdout.write를 사용한다. 단, write를 사용할 경우에는 반드시 문자열을 넣어야 한다. int형 변수를 넣을 경우에는 TypeError: write() argument must be str, not int라는 에러가 발생한다. 따라서,sys.stdout.write를 사용할 경우에는 str로 변형하여 출력하면 된다.

import sys

print(sys.stdin.readline())

 

 

일반적인 print문을 사용했을 때보다 sys 모듈을 사용하여 출력했을 경우 약 0.2 차이가 난다.

import time
import sys
print = sys.stdout.write

start = time.time()
for i in range(0, 10000) : 
    print(str(i) + '\n')
end = time.time()

print(str(end - start) + '\n')


start2 = time.time()
for i in range(0, 10000) : 
    print(str(i) + '\n')
end2 = time.time()
print(str(end2-start2)+ '\n')
print(str(end - start)+ '\n')

 

위의 코드를 보면 기존 print() 출력함수를 사용하면 줄바꿈이 들어가지만, sys 모듈 출력함수를 사용하면 줄바꿈이 들어가지 않아 개행문자를 추가해줘야 한다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기