<개인공부>/[Python]

[python] 파이썬 시간 측정, 프로그램 시간 측정 방법

BlockDMask 2021. 6. 21. 00:30
반응형

안녕하세요. BlockDMask입니다.
파이썬으로 개발을 하다 보면 내가 만든 함수, 프로그램의 성능이 어느 정도인지 수행 시간이 궁금한 경우가 있습니다.
그럴 때 아래 설명할 파이썬 코드 실행 시간 측정 방법을 이용해서 측정을 하면 됩니다.

<목차>
1. time 모듈을 이용한 시간 측정
2. datetime 모듈을 이용해서 조금 이쁘게 시간 측정 출력

 

1. 파이썬 시간 측정 방법 (time 모듈)


시간을 다루는 모듈인 time 모듈이 있습니다.
time 모듈에 있는 함수들을 이용하면 특정 코드가 실행되는 시간을 측정할 수 있습니다.

time모듈에 time()이라는 함수가 존재하는데요.
공식 문서에 따르면 이 함수의 반환 값은 "에포크 이후 초를 나타내는 시간을 부동 소수점 숫자로 반환" 하는 함수라고 합니다.

간단히 생각해보면 "어떤 기준으로부터 흐른 시간을 초로 나타낸 것이구나"라고 생각하면 됩니다.
정확한 의미는 다른 포스팅에서 다루겠습니다.

아무튼 이 시간 time.time() 함수를 이용해서 프로그램 수행 시간을 알 수 있습니다.
1) 측정해야 할 함수나 계산들 전에 time.time()으로 시작 시간을 기록해주고
2) 함수나 계산이 끝나는 부분에 time.time() 으로 끝나는 시간을 기록합니다.
3) (끝나는 시간 - 시작시간) 을 계산하게 되면 그만큼 걸린 시간이 sec 으로 계산되어 나오게 됩니다.

바로 코드를 볼까요?

import math
import time

start = time.time()
math.factorial(100000)
end = time.time()

print(f"{end - start:.5f} sec")

factorial(100000)을 계산하는데 까지 걸린 시간은 0.17254 초가 걸렸네요.
이런 식으로 파이썬에서 함수 시간, 계산시간을 측정할 수 있습니다. 쉽죠?

상세하게 설명을 하자면 아래와 같습니다.
math 모듈에 있는 factorial 함수를 이용해서 factorial을 계산하도록 하였습니다. (따로 결괏값은 출력 X)
이 계산시간이 얼마나 걸렸는지를 파악하기 위해서
math.factorial 함수 시작 전에 time.time() 을 이용해서 시간을 한번 재고,
함수가 끝난 후에 time.time() 을 이용해서 시간을 쟀습니다.

그 시간들을 end - start 를 해서 출력을 했습니다.
출력이 소수점이 너무 길기 때문에 :.5f 를 이용해서 소수점 5자리까지만 출력하도록 하였습니다.

 

파이썬 fatorial 함수에 대해서 궁금하신 분들은 [바로가기]
파이썬 소수점 제한 방법에 대해서 알고 싶으신 분들은 [바로가기]

 

 

2. 파이썬 시간 측정 방법 (datetime 모듈로 이쁘게 출력하기)


프로그램 수행 시간을 저렇게 0.1752초 이런 식으로 출력되는게 아닌 00시 00분 00초 이런식으로 출력되도록 하고 싶다면 datetime 모듈을 이용하면 간단하게 해결할 수 있습니다.

datetime 모듈은 이름에서 느낌이 오듯, 날짜와 시간을 다루는 모듈입니다. 
해당 모듈에 대한 자세한 설명은 추후 포스팅하겠습니다.

datetime 모듈 중에서 우리는 초(sec) 시간을 다룰 수 있는 timedelta 객체를 이용할 것입니다.
timedelta 객체에 시간을 대입하면, 알아서 분, 초, 시간으로 데이터를 쪼개서 세팅하고 있다고 생각하면 됩니다.

예를 들어 time.timedelta(seconds=100) 이런 식으로 객체를 만들면 1분 40초로 알아서 시간을 가지고 있다는 이야기입니다.

timedelta 객체를 그대로 출력하면 "시:분:초.마이크로초" 즉 h:mm:ss.ms 이런 식으로 나오게 됩니다.

마이크로초가 꼴 보기 싫기 때문에 이걸 . 을 기준으로 잘라서 앞부분만 출력하도록 하겠습니다.
"h:mm:ss.ms" 문자열에 .split(".") 을 이용해서 .을 기준으로 잘라줍니다.

그럼 리스트로 ["h:mm:ss", "ms"] 이런 식으로 시간이 나뉘게 됩니다.
그럼 우리는 리스트[0] 해서 앞부분만 떼 가지고 출력하면 
우리가 원하는 "이쁘게 시간 측정 출력"이 가능해지는 것입니다.

바로 코드를 볼까요?

import math
import time
import datetime

start = time.time()
math.factorial(1234567)
end = time.time()


sec = (end - start)
result = datetime.timedelta(seconds=sec)
print(result)

result_list = str(datetime.timedelta(seconds=sec)).split(".")
print(result_list[0])

첫 번째 출력인 h:mm:ss.ms 는 timedelta 객체를 그대로 출력하면 나오게 됩니다.
두 번째 출력인 h:mm:ss 는 이전에 설명했듯이 datetime.timedelta객체를 .split(".") 해서 리스트로 자른 다음에 0번째 인덱스를 출력해서 나오게 된 것을 볼 수 있습니다.

아무튼 이렇게 시간을 이쁘게 출력하기 위해서 시간을 다루는 객체인 timedelta 객체를 이용해서 출력해 보았습니다.
코드 실행 시간을 간단하게 측정하려면 처음에 사용한 time.time() 만 이용하면 되고, 조금 이쁘게 출력하려면 datetime.timedelta추가해서 사용하면 될 것 같습니다.

 

이렇게 파이썬에서 프로그램의 수행 시간, 함수 실행시간을 구하는 방법에 대해서 알아보았습니다.
감사합니다.

반응형