35

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

3
  • 2
    I'd suggest a class decorator instead of implementing the timing in BaseClass. Commented Feb 11, 2010 at 14:48
  • 3
    Why not just use a profiler like cProfiler whenever you want to know the timings? Commented Feb 11, 2010 at 14:49
  • @Justin cProfiler is good but what I needed was to know about timings each time to report them. Commented Feb 11, 2010 at 16:01

3 Answers 3

65

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'
Sign up to request clarification or add additional context in comments.

3 Comments

Great example of clean code to show how decorators are one of the best joys in Python
@ronnieaka I'ts just the module name. I wrote the definitions of timed and somefunction in timedec.py and imported it from the interpreter to test them.
Good stuff. Thank you. One thing to share with other people. It makes more sense to measure the execution time in milliseconds. e.g. Geoff's answer worked for me, but I only saw the following. abc_function took 0 time to finish. This change will convert the time to milliseconds print "%s took %d milliSeconds to finish" % (f.__name__, elapsed*1000)
10

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.

Comments

6

There is also timeit, which is part of the standard library, and is really easy to use. Remember: don't reinvent the wheel!

2 Comments

Indeed very simple and easy to use!
timeit seems promising! I will combine it with Geoff's solution.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.