초단위 실행 시간 측정
time() 함수를 사용한다.
[예시]
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
[실행결과]
hello
0.0
너무 빨리 실행되면 0초로 찍힌다.
[예시2]
import time
start = time.time()
for i in range(10000):
print(i)
end = time.time()
print(end - start)
[실행결과]
0
1
2
3
4
5
....
0.03602433204650879
로컬 시간의 시계 가져오기
from timeit import default_timer as timer
start = timer()
print('hi')
end = timer()
print(end - start) # Time in seconds, e.g. 5.38091952400282
데코레이터 함수 사용한 시간 측정
함수 1
def timing(f):
def wrap(*args, **kwargs):
time1 = time.time()
ret = f(*args, **kwargs)
time2 = time.time()
print('{:s} function took {:.3f} ms'.format(f.__name__, (time2-time1)*1000.0))
return ret
return wrap
사용방법 - 사용 함수 위에 @ 를 붙이고 데코레이터 함수를 붙임
[예시]
@timing
def count_ten():
for i in range(10):
print(i)
count_ten()
[출력결과]
0
1
2
3
4
5
6
7
8
9
count_ten function took 0.000 ms
함수2
kwargs와 functools가 추가된 버전
→ kwargs 는 여러 인자를 받을 수 있고, functools는 하나 이상의 인수가 이미 채워진 새 버전의 함수를 만들 때 사용하는 함수이다.
import time
import functools
def timeit(func):
@functools.wraps(func)
def new_func(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
elapsed_time = time.time() - start_time
print('function [{}] finished in {} ms'.format(
func.__name__, int(elapsed_time * 1_000)))
return result
return new_func
@timeit
def foobar():
for i in range(10000):
print(i)
foobar()
[실행결과]
...
9998
9999
function [foobar] finished in 35 ms
함수3
from functools import wraps
from time import time
def timing(f):
@wraps(f)
def wrap(*args, **kw):
ts = time()
result = f(*args, **kw)
te = time()
print('func:%r args:[%r, %r] took: %2.4f sec' % \
(f.__name__, args, kw, te-ts))
return result
return wrap
데코레이터 함수를 이용하여 함수 초 세는데 계속 0초가 반환되는 경우
방법 1
문제의 해결책은 time 모듈 대신 timeit 모듈을 사용하는 것이다.
import timeit
...
def main(ville):
start = timeit.default_timer()
solution = dynamique(ville)
end = timeit.default_timer()
return (end - start, solution)
방법2
0초로 나오는 이유: 코드가 의도한 대로 작동하지만, 너무 작은 숫자(예: .0013666152954102 seconds ) 안에 끝나기 때문
해결책: time.sleep(1) 을 써주는 것이다.
def time_cal(func):
def wrapper(*args, **kwargs):
start=time.time()
time.sleep(1)
result = func(*args, **kwargs)
end= time.time()
print(func.__name__+ ' took ' + str((end-start)*1000) + ' milli seconds')
return result
return wrapper
[실행결과]
none are present
none are present
even_num took 1009.1550350189209 milli seconds
number one 1
number two 2
number three 3
list_num took 1000.5834102630615 milli seconds
참고 링크1: https://stackoverflow.com/questions/70642928/python-measure-function-execution-time-with-decorator
'개발공부 > Python' 카테고리의 다른 글
[Python] 소상공인시장진흥공단 광주 상가 정보 시각화해보기 (0) | 2023.08.08 |
---|---|
[Python] requirements.txt 생성하고 패키지 관리하기 (0) | 2023.07.28 |
[Python] *args 와 **kwargs(function definition) 정리 (0) | 2023.06.27 |
[Matplotlib] 그래프에 옵션 추가 - title(), legend(), color(), marker(), linestyle() (0) | 2023.06.23 |
[Python] List Comprehension(리스트 컴프리헨션) 공부와 Nato 알파벳 음성기호 만들기 (0) | 2023.06.10 |