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

Типичные примитивные типы .NET не имеют общего интерфейса, который позволяет использовать их для вычислений. Можно было бы определить ваши собственные интерфейсы (например, ISignedWholeNumber), которые будут выполнять такие операции, определять структуры, которые содержат один Int16, Int32 и т. Д., И реализовывать эти интерфейсы, а затем использовать методы, которые принимают общие типы ограничено ISignedWholeNumber, но для преобразования числовых значений в типы структуры, вероятно, будет неприятность.

Альтернативным подходом было бы определить статический класс Int64Converter<T> со статическим свойством bool Available {get;}; и статическим делегаты для Int64 GetInt64(T value), T FromInt64(Int64 value), bool TryStoreInt64(Int64 value, ref T dest). Конструктор класса может быть жестко закодирован для загрузки делегатов для известных типов и, возможно, использовать Reflection для проверки того, реализует ли тип T методы с собственными именами и сигнатурами (в случае, если это что-то вроде структуры, которая содержит Int64 и представляет собой число, но имеет собственный метод ToString()). Такой подход потеряет преимущества, связанные с проверкой типа времени компиляции, но все равно удастся избежать операций в боксе, и каждый тип нужно будет только «проверять» один раз. После этого операции, связанные с этим типом, будут заменены диспетчером делегатов.

28
задан pars 11 February 2010 в 04:44
поделиться

3 ответа

Один из способов сделать это - использовать декоратор (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'
50
ответ дан Geoff Reedy 20 November 2019 в 02:33
поделиться

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

6
ответ дан jathanism 20 November 2019 в 02:33
поделиться

Проверяли ли вы модуль «профиль» ?

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

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

10
ответ дан 28 November 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: