Функция измерения времени Python

Я хочу создать функцию python для проверки времени, затраченного на каждую функцию, и напечатать его имя со временем, как я могу напечатать имя функции, и если есть другой способ сделать это, пожалуйста, скажите мне

def measureTime(a): start = time.clock() a() elapsed = time.clock() elapsed = elapsed - start print "Time spent in (function name) is: ", elapsed 

  • Получить имя месяца от номера
  • Python - запуск функции в заданное время
  • Изменение даты и времени на отметку времени Unix в Python
  • Печать временных меток (час / минута / секунда) с помощью Matplotlib
  • точно измерять функцию времени python
  • Как печатать дату в обычном формате в Python?
  • Функция any () в Python с обратным вызовом
  • Скрученный: отложенный, который срабатывает многократно?
  • Python - запуск функции в заданное время
  • Как я могу получить удобочитаемую разницу в человеке при вычитании двух временных меток UNIX с помощью Python?
  • Python - возврат из обратного вызова Tkinter
  • Создание диапазона дат в Python
  • 8 Solutions collect form web for “Функция измерения времени Python”

    Прежде всего, я настоятельно рекомендую использовать профилировщик или по крайней мере использовать timeit .

    Однако, если вы хотите написать свой собственный метод синхронизации строго, чтобы узнать, вот где-то начать использовать декоратор.

     def timing(f): def wrap(*args): time1 = time.time() ret = f(*args) time2 = time.time() print '%s function took %0.3f ms' % (f.func_name, (time2-time1)*1000.0) return ret return wrap 

    И использование очень просто, просто используйте декоратор @timing:

     @timing def do_work(): #code 

    Примечание. Я f.func_name чтобы получить имя функции в виде строки (в Python 2) или f.__name__ в Python 3.

    После игры с модулем timeit мне не нравится его интерфейс, который не настолько изящен по сравнению со следующими двумя способами.

    Следующий код находится в Python 3.

    Метод декоратора

    Это почти то же самое с методом Майка. Здесь я добавляю kwargs и functools wrap, чтобы сделать его лучше.

     def timeit(func): @functools.wraps(func) def newfunc(*args, **kwargs): startTime = time.time() func(*args, **kwargs) elapsedTime = time.time() - startTime print('function [{}] finished in {} ms'.format( func.__name__, int(elapsedTime * 1000))) return newfunc @timeit def foobar(): mike = Person() mike.think(30) 

    Метод контекстного менеджера

     from contextlib import contextmanager @contextmanager def timeit_context(name): startTime = time.time() yield elapsedTime = time.time() - startTime print('[{}] finished in {} ms'.format(name, int(elapsedTime * 1000))) 

    Например, вы можете использовать его так:

     with timeit_context('My profiling code'): mike = Person() mike.think() 

    И код внутри блока будет синхронизирован.

    Вывод

    Используя первый метод, вы можете прокомментировать декоратор, чтобы получить нормальный код. Тем не менее, это может быть только время функции. Если у вас есть часть кода, в которой у вас нет того, что бы сделать ее функцией, вы можете выбрать второй метод.

    Например, теперь у вас есть

     images = get_images() bigImage = ImagePacker.pack(images, width=4096) drawer.draw(bigImage) 

    Теперь вы хотите bigImage = ... строку bigImage = ... Если вы измените его на функцию, это будет:

     images = get_images() bitImage = None @timeit def foobar(): nonlocal bigImage bigImage = ImagePacker.pack(images, width=4096) drawer.draw(bigImage) 

    Выглядит не так хорошо … Что делать, если вы находитесь в Python 2, у которого нет nonlocal ключевого слова.

    Вместо этого использование второго метода здесь очень хорошо подходит:

     images = get_images() with timeit_context('foobar'): bigImage = ImagePacker.pack(images, width=4096) drawer.draw(bigImage) 

    Я не вижу проблемы с модулем timeit . Вероятно, это самый простой способ сделать это.

     import timeit timeit.timeit(a, number=1) 

    Также возможно отправить аргументы в функции. Все, что вам нужно, это обернуть вашу функцию, используя декораторы. Больше объяснений здесь: http://www.pythoncentral.io/time-a-python-function/

    Единственный случай, когда вам может быть интересно написать свои собственные операторы синхронизации, – это если вы хотите запускать функцию только один раз и также хотите получить ее возвращаемое значение.

    Преимущество использования модуля timeit заключается в том, что он позволяет вам повторить количество исполнений. Это может быть необходимо, потому что другие процессы могут мешать вашей точности синхронизации. Таким образом, вы должны запускать его несколько раз и смотреть на самое низкое значение.

    Используйте такой профайлер, а не пытайтесь реализовать такую ​​функциональность самостоятельно.

    Timeit имеет два больших недостатка: он не возвращает возвращаемое значение функции, и использует eval, что требует передачи дополнительного кода настройки для импорта. Это решает обе проблемы просто и элегантно:

     def timed(f): start = time.time() ret = f() elapsed = time.time() - start return ret, elapsed timed(lambda: database.foo.execute('select count(*) from source.apachelog')) (<sqlalchemy.engine.result.ResultProxy object at 0x7fd6c20fc690>, 4.07547402381897) 

    Метод декоратора с использованием декоратора Библиотека Python:

     import decorator @decorator def timing(func, *args, **kwargs): '''Function timing wrapper Example of using: ``@timing()`` ''' fn = '%s.%s' % (func.__module__, func.__name__) timer = Timer() with timer: ret = func(*args, **kwargs) log.info(u'%s - %0.3f sec' % (fn, timer.duration_in_seconds())) return ret 

    См. Сообщение в моем блоге:

    сообщение на mobilepro.pl Блог

    мой пост в Google Plus

    Существует простой инструмент для синхронизации. https://github.com/RalphMao/PyTimer

    Он может работать как декоратор :

     from pytimer import Timer @Timer(average=False) def matmul(a,b, times=100): for i in range(times): np.dot(a,b) 

    Вывод:

     matmul:0.368434 matmul:2.839355 

    Он также может работать как таймер подключаемого модуля с управлением пространством имен (полезно, если вы вставляете его в функцию, которая имеет много кодов и может быть вызвана где угодно).

     timer = Timer() def any_function(): timer.start() for i in range(10): timer.reset() np.dot(np.ones((100,1000)), np.zeros((1000,500))) timer.checkpoint('block1') np.dot(np.ones((100,1000)), np.zeros((1000,500))) np.dot(np.ones((100,1000)), np.zeros((1000,500))) timer.checkpoint('block2') np.dot(np.ones((100,1000)), np.zeros((1000,1000))) for j in range(20): np.dot(np.ones((100,1000)), np.zeros((1000,500))) timer.summary() for i in range(2): any_function() 

    Вывод:

     ========Timing Summary of Default Timer======== block2:0.065062 block1:0.032529 ========Timing Summary of Default Timer======== block2:0.065838 block1:0.032891 

    Надеюсь, это поможет

    Мой способ сделать это:

     from time import time def printTime(start): end = time() duration = end - start if duration < 60: return "used: " + str(round(duration, 2)) + "s." else: mins = int(duration / 60) secs = round(duration % 60, 2) if mins < 60: return "used: " + str(mins) + "m " + str(secs) + "s." else: hours = int(duration / 3600) mins = mins % 60 return "used: " + str(hours) + "h " + str(mins) + "m " + str(secs) + "s." 

    Задайте переменную как start = time() перед выполнением функции / петли и printTime(start) сразу после блока.

    и вы получили ответ.

    Python - лучший язык программирования в мире.