소연의_개발일지

 

초단위 실행 시간 측정

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 - measure function execution time with decorator

I have the next problem: For example, I have a function (this is just an example to make things simple) called my_pow, that takes two arguments and return a^b, and it looks like this: def my_pow(a,...

stackoverflow.com

참고 링크2: https://stackoverflow.com/questions/69205847/not-able-print-the-time-elapse-for-function-by-using-the-decorator

 

Not able print the time elapse for function by using the decorator

I created a decorator which calculates the time elapsed for a function by when running the program it gives 0 milliseconds as output for given decorator and in debugging tool it shows the start/ en...

stackoverflow.com

 

profile

소연의_개발일지

@ssoyxon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!