как измерить время выполнения функций (автоматически) в Python - PullRequest
28 голосов
/ 11 февраля 2010

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

Так что intead из имеет что-то вроде этого:

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 должен заниматься измерением времени

Ответы [ 3 ]

49 голосов
/ 11 февраля 2010

Один из способов сделать это - использовать декоратор (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'
10 голосов
/ 11 февраля 2010

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

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

Для аналогичного решения вы также можете поискать «горячую строчку» в Python.

6 голосов
/ 11 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...