Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to measure execution time of functions (automatically) in Python

Tags:

python

oop

I need to have a base class which I will use to inherit other classes which I would like to measure execution time of its functions.

So intead of having something like this:

class Worker():     def doSomething(self):         start = time.time()         ... do something         elapsed = (time.time() - start)         print "doSomething() took ", elapsed, " time to finish"  #outputs: doSomething() took XX time to finish 

I would like to have something like this:

class Worker(BaseClass):     def doSomething(self):         ... do something  #outputs the same: doSomething() took XX time to finish 

So the BaseClass needs to dealing with measuring time

like image 412
pars Avatar asked Feb 11 '10 14:02

pars


People also ask

How do you check the performance of a function in Python?

If your function is relatively long-running, so you don't want to repeatedly call it, just get the current time with start = time. process_time() (or time. time() ) before the call, then get the current time again after the call, so the time taken would be the difference time. process_time() - start .

Does Python have a timer function?

A timer in Python is a time-tracking program. Python developers can create timers with the help of Python's time modules. There are two basic types of timers: timers that count up and those that count down.


2 Answers

One way to do this would be with a decorator (PEP for decorators) (first of a series of tutorial articles on decorators). Here's an example that does what you want.

from functools import wraps from time import time  def timed(f):   @wraps(f)   def wrapper(*args, **kwds):     start = time()     result = f(*args, **kwds)     elapsed = time() - start     print "%s took %d time to finish" % (f.__name__, elapsed)     return result   return wrapper 

This is an example of its use

@timed def somefunction(countto):   for i in xrange(countto):     pass   return "Done" 

To show how it works I called the function from the python prompt:

>>> timedec.somefunction(10000000) somefunction took 0 time to finish 'Done' >>> timedec.somefunction(100000000) somefunction took 2 time to finish 'Done' >>> timedec.somefunction(1000000000) somefunction took 22 time to finish 'Done' 
like image 199
Geoff Reedy Avatar answered Oct 04 '22 12:10

Geoff Reedy


Have you checked the "profile" module?

I.e. are you sure you need to implement your own custom framework instead of using the default profiling mechanism for the language?

You could also google for "python hotshot" for a similar solution.

like image 44
p.marino Avatar answered Oct 04 '22 10:10

p.marino