Я хочу создать функцию Python, чтобы проверить время, затраченное на каждую функцию, и распечатать ее имя с указанием времени, как я могу распечатать имя функции, и если есть другой способ сделать это, скажите мне
def measureTime(a):
start = time.clock()
a()
elapsed = time.clock()
elapsed = elapsed - start
print "Time spent in (function name) is: ", elapsed
timeit
для измерения. Он не идеален, но он намногоtimeit
лучше, чем вы, и его намного проще использовать, чем самому придумать что-то лучшее.Ответы:
Прежде всего, я настоятельно рекомендую использовать профилировщик или, по крайней мере, timeit .
Однако, если вы хотите написать свой собственный метод синхронизации, чтобы научиться, вот где можно начать использовать декоратор.
Python 2:
И использование очень простое, просто используйте декоратор @timing:
Python 3:
Обратите внимание: я звоню,
f.func_name
чтобы получить имя функции в виде строки (в Python 2) илиf.__name__
в Python 3.источник
После игры с
timeit
модулем мне не нравится его интерфейс, который не так элегантен по сравнению с двумя следующими способами.Следующий код находится на Python 3.
Метод декоратора
Это почти то же самое с методом @Mike. Здесь я добавляю
kwargs
иfunctools
оборачиваю, чтобы было лучше.Метод диспетчера контекста
Например, вы можете использовать это как:
И код в
with
блоке будет синхронизирован.Вывод
Используя первый метод, вы можете каждый день закомментировать декоратор, чтобы получить нормальный код. Однако это может только время функции. Если у вас есть часть кода, которую вы не знаете, чтобы сделать ее функцией, вы можете выбрать второй метод.
Например, теперь у вас есть
Теперь вы хотите измерить время
bigImage = ...
линии. Если вы измените его на функцию, это будет:Выглядит не очень хорошо ... Что делать, если вы используете Python 2, в котором нет
nonlocal
ключевого слова.Вместо этого здесь очень подходит второй метод:
источник
timeit
интерфейс и использоватьwraps()
функциюfunctools
модуля. Я имею в виду, что весь этот дополнительный код не нужен.import functools
Я не понимаю, в чем проблема с
timeit
модулем. Это, наверное, самый простой способ сделать это.Также можно отправлять аргументы функциям. Все, что вам нужно, это завершить вашу функцию с помощью декораторов. Дополнительные объяснения здесь: http://www.pythoncentral.io/time-a-python-function/
Единственный случай, когда вы можете быть заинтересованы в написании собственных операторов времени, - это если вы хотите запустить функцию только один раз и также хотите получить ее возвращаемое значение.
Преимущество использования
timeit
модуля в том, что он позволяет вам повторять количество выполнений. Это может быть необходимо, потому что другие процессы могут повлиять на точность синхронизации. Итак, вы должны запустить его несколько раз и посмотреть на наименьшее значение.источник
timeit.timeit(lambda: func(a,b,c), number=1)
? Я использую это при тестировании гипотетического решения в терминале.Timeit имеет два больших недостатка: он не возвращает возвращаемое значение функции и использует eval, что требует передачи дополнительного кода настройки для импорта. Это решает обе проблемы просто и элегантно:
источник
Есть простой инструмент для расчета времени. https://github.com/RalphMao/PyTimer
Может работать как декоратор :
Вывод:
Он также может работать как таймер подключаемого модуля с контролем пространства имен (полезно, если вы вставляете его в функцию, которая имеет много кодов и может быть вызвана где угодно).
Вывод:
Надеюсь, это поможет
источник
Метод декоратора с использованием библиотеки декоратора Python:
См. Сообщение в моем блоге:
разместить в блоге mobilepro.pl
мой пост в Google Plus
источник
Мой способ сделать это:
Установите переменную, как
start = time()
перед выполнением функции / циклов, иprintTime(start)
сразу после блока.и вы получили ответ.
источник