Подтвердить что ты не робот

Как измерить время выполнения функций (автоматически) в Python

Мне нужен базовый класс, который я буду использовать для наследования других классов, которые я хотел бы измерить время выполнения его функций.

Итак введите что-то вроде этого:

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

Я хотел бы иметь что-то вроде этого:

class Worker(BaseClass):
    def doSomething(self):
        ... do something

#outputs the same: doSomething() took XX time to finish

Таким образом, BaseClass должен иметь дело с измерением времени

4b9b3361

Ответ 1

Один из способов сделать это будет с декоратором (PEP для декораторов) (первая из серии обучающих статей о декораторах). Вот пример, который делает то, что вы хотите.

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

Это пример его использования

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

Чтобы показать, как это работает, я вызвал функцию из приглашения python:

>>> 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'

Ответ 2

Вы проверили модуль "profile" ?

т.е. вы уверены, что вам нужно реализовать свою собственную инфраструктуру вместо использования механизма профилирования по умолчанию для языка?

Вы также можете google для "hotshot python" для аналогичного решения.

Ответ 3

Существует также timeit, который является частью стандартной библиотеки и очень прост в использовании. Помните: не изобретайте велосипед!