tags:

views:

398

answers:

4

Hello!

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

+4  A: 

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.

p.marino
+1 for profiling.
Khelben
A: 

It's a rough solution, but I think this can help you:

import time

class BaseClass():
    def __init__(self):
        self.start = time.time()
    def get_end(self):
        self.end = (time.time() - self.start)
        return self.end

class WhatEver(BaseClass):
    a = 0
    while a < 50:
        print a
        a += 1
    print "It took " + str(BaseClass().get_end()) + " seconds."

Careful! This implementation is somehow wrong, but "it works". It returns a float value.

Hope this helps :)

Oscar Carballal
This doesn't work! You're measuring the time between constructing `BaseClass()` and calling its `.get_end()`.
Beni Cherniavsky-Paskin
it is not very convenient to use I guess.
celalo
Ouch! Guess you're right. I messed up things a bit. I'm not too experienced, sorry for the mistake.
Oscar Carballal
+7  A: 

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'
Geoff Reedy
Thank you for the great answer! this was exactly what I was looking for.
celalo
+2  A: 

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

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