Python decorator to measure the execution time of methods

Being a python developer you will always in need for profiling the application. In my current project my goal was figure out the bottleneck in the code. For that i had track the execution time for each methods.

So in the beginning, i started by storing the current time in start_time variable and then i let the method execute and then subtract the start_time with current time to get the actual method execution time as mentioned below:

start_time = int(round(time.time() * 1000))
employees = Employee.get_all_employee_details()
time_diff = current_milli_time() — start_time debug_log_time_diff.update({'FETCH_TIME': time_diff})

There is no issue with the above line of code but you know, this will significantly keep on increasing when you have many method/function call. At one point, it will be difficult to figure out the actual code and what you will see is the repetition of this code.

To overcome this, created the @timeit decorator which allows you to measure the execution time of the method/function by just adding the @timeit decorator on the method.

@timeit decorator:

def timeit(method):
def timed(*args, **kw):
ts = time.time()
result = method(*args, **kw)
te = time.time()
        if 'log_time' in kw:
name = kw.get('log_name', method.__name__.upper())
kw['log_time'][name] = int((te - ts) * 1000)
else:
print '%r %2.2f ms' % \
(method.__name__, (te - ts) * 1000)
return result
    return timed

Adding decorator to the method

@timeit
def get_all_employee_details(**kwargs):
print 'employee details'

The code will look like this after removing the redundant code.

logtime_data ={}
employees = Employee.get_all_employee_details(log_time=logtime_data)

Hurray!! All that messy code is gone and now it looks simple and clear.

log_time and log_name are optional. Make use of them accordingly when needed.

Other articles

Reference

Python Decorator for execution time

P.S. Thanks for reading this far! If you found value in this, I’d really appreciate it if you recommend this post (by clicking the ❤ button) so other people can see it!.