Как измерить время выполнения функций (автоматически) в 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 должен иметь дело с измерением времени
Ответы
Ответ 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, который является частью стандартной библиотеки и очень прост в использовании. Помните: не изобретайте велосипед!