Если вы просто хотите измерить прошедшее время между двумя точками, вы можете использовать time.time()
:
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
Это дает время выполнения в секундах.
Другим вариантом, начиная с 3.3, может быть использование perf_counter
или process_time
, в зависимости от ваших требований. До 3.3 рекомендовано использовать time.clock
(спасибо Amber ). Тем не менее, в настоящее время это устарело:
В Unix верните текущее время процессора в виде числа с плавающей запятой, выраженного в секундах. Точность, и фактически само определение значения «процессорного времени», зависит от точности функции C с тем же именем.
В Windows эта функция возвращает часы настенных часов, прошедшие с момента первого вызова этой функции, в виде числа с плавающей запятой на основе функции Win32 QueryPerformanceCounter()
. Разрешение обычно лучше, чем одна микросекунда.
Устаревший с версии 3.3 : поведение этой функции зависит от платформы: используйте perf_counter()
или process_time()
вместо этого , в зависимости от ваших требований, чтобы иметь четко определенное поведение.
time.clock()
производительности на самом деле предпочтительнее, поскольку на него нельзя вмешиваться, если системные часы портятся, но в.time()
основном он выполняет ту же задачу.)print(timedelta(seconds=execution_time))
. Хотя это отдельный вопрос.Используйте
timeit.default_timer
вместоtimeit.timeit
. Первый обеспечивает лучшие часы, доступные на вашей платформе и версии Python автоматически:timeit.default_timer присваивается time.time () или time.clock () в зависимости от ОС. На Python 3.3+ default_timer - это time.perf_counter () на всех платформах. Видеть Python - time.clock () против time.time () - точность?
Смотрите также:
источник
default_timer() measurations can be affected by other programs running on the same machine, so the best thing to do when accurate timing is necessary is to repeat the timing a few times and use the best time. The -r option is good for this; the default of 3 repetitions is probably enough in most cases. On Unix, you can use time.clock() to measure CPU time.
perf
модуль (не существовавший на момент ответа), который предоставляет тот же интерфейс, но иногда он отличается отtimeit
решений, принимаемых модулем в отношении измерения производительности времени.Только Python 3:
Так как time.clock () устарела начиная с Python 3.3 , вы захотите использовать его
time.perf_counter()
для общесистемной синхронизации илиtime.process_time()
для всего процесса, так же, как вы использовалиtime.clock()
:Новая функция
process_time
не будет включать время, прошедшее во время сна.источник
timeit.default_timer
вместоtime.perf_counter
. Первый выберет подходящий таймер для измерения производительности времени, настроенной для вашей платформы и версии Python.process_time()
делает не включает в себя время во время сна и , следовательно , он не подходит для измерения затраченного времени.Учитывая функцию, которую вы хотели бы время,
test.py:
самый простой способ
timeit
- вызвать его из командной строки:Не пытайтесь использовать
time.time
илиtime.clock
(наивно) сравнивать скорость функций. Они могут дать ошибочные результаты .PS. Не помещайте операторы печати в функцию, которую вы хотите синхронизировать; в противном случае измеренное время будет зависеть от скорости терминала .
источник
Это интересно сделать с помощью менеджера контекста, который автоматически запоминает время начала при входе в
with
блок, а затем замораживает время окончания при выходе из блока. С небольшой хитростью вы можете даже получить подсчет прошедшего времени внутри блока из той же функции менеджера контекста.Базовая библиотека не имеет этого (но, вероятно, должна). Оказавшись на месте, вы можете делать такие вещи, как:
Вот код contextmanager, достаточный для выполнения этой задачи :
И некоторый работающий демонстрационный код:
Обратите внимание, что в силу этой функции возвращаемое значение
elapsed()
замораживается при выходе из блока, а последующие вызовы возвращают ту же продолжительность (примерно 6 секунд в этом игрушечном примере).источник
Время измерения в секундах:
Выход :
источник
Я предпочитаю это.
timeit
Документ слишком запутанный.Обратите внимание, что здесь не происходит никакого форматирования, я просто написал
hh:mm:ss
в распечатке, чтобы можно было интерпретироватьtime_elapsed
источник
Вот еще один способ сделать это:
Сравнение с традиционным способом:
Установка:
Обратитесь к странице PyPi для более подробной информации.
источник
t.tic()
в коде, разработчик должен составить мысленный список того, где в этой серии я должен ожидать этого. Вы устанавливаете гнезда или просто несколько тиктоков?ttictoc
. У меня был большой беспорядок, но теперь все должно быть хорошо.Вот мои выводы, пройдя здесь много хороших ответов, а также несколько других статей.
Во-первых, если вы спорите между
timeit
иtime.time
, уtimeit
него есть два преимущества:timeit
выбирает лучший таймер, доступный в вашей версии ОС и Python.timeit
отключает сборку мусора, однако это не то, что вы можете или не можете хотеть.Теперь проблема в том, что
timeit
это не так просто использовать, потому что он требует настройки, и все становится ужасно, когда у вас есть куча импорта. В идеале, вы просто хотите декоратор или использоватьwith
блок и измерять время. К сожалению, для этого нет ничего встроенного, поэтому у вас есть два варианта:Вариант 1. Использование библиотеки временных бюджетов
Timebudget является универсальной и очень простой библиотекой, которую можно использовать только в одной строке коды после установки пипа.
Вариант 2: использовать модуль кода напрямую
Я создал ниже маленький служебный модуль.
Теперь вы можете определить время любой функции, просто поставив перед ней декоратор:
Если вы хотите синхронизировать часть кода, просто поместите ее в
with
блок:Преимущества:
Есть несколько полуобеспеченных версий, поэтому я хочу отметить несколько основных моментов:
with utils.MeasureBlockTime() as t
а затемt.elapsed
).источник
Использование
time.time
для измерения выполнения дает вам общее время выполнения ваших команд, включая время, затраченное другими процессами на вашем компьютере. Это время, которое пользователь замечает, но это не очень хорошо, если вы хотите сравнить разные фрагменты кода / алгоритмы / функции / ...Больше информации о
timeit
:Если вы хотите более глубокое понимание профилирования:
Обновление : я много использовал http://pythonhosted.org/line_profiler/ в течение последнего года и считаю его очень полезным и рекомендую использовать его вместо модуля профиля Pythons.
источник
Вот небольшой класс таймера, который возвращает строку «чч: мм: сс»:
Применение:
источник
Модули python cProfile и pstats предлагают отличную поддержку для измерения времени, прошедшего в определенных функциях, без необходимости добавления какого-либо кода вокруг существующих функций.
Например, если у вас есть скрипт на python timeFunctions.py:
Чтобы запустить профилировщик и сгенерировать статистику для файла, вы можете просто запустить:
Для этого используется модуль cProfile для профилирования всех функций в timeFunctions.py и сбора статистики в файле timeStats.profile. Обратите внимание, что нам не нужно было добавлять какой-либо код в существующий модуль (timeFunctions.py), и это можно сделать с любым модулем.
Получив файл статистики, вы можете запустить модуль pstats следующим образом:
Это запускает интерактивный браузер статистики, который дает вам много приятных функций. Для вашего конкретного случая использования вы можете просто проверить статистику вашей функции. В нашем примере проверка статистики для обеих функций показывает нам следующее:
Дурацкий пример мало что дает, но дает представление о том, что можно сделать. Лучшая часть этого подхода заключается в том, что мне не нужно редактировать существующий код, чтобы получить эти цифры и, очевидно, помочь с профилированием.
источник
python -m pstats timeStats.profile ValueError: bad marshal data (unknown type code)
проверьте свою версию Python, которую вы используете. Я получил это, когда я побежалpython3 -m cProfile...
иpython -m pstats
. Моя ошибка, но получила меня на секунду, поэтому я хотел поделитьсяdon't forget consistency
. =)Вот еще один менеджер контекста для временного кода -
Применение:
или, если вам нужно значение времени
benchmark.py :
Адаптировано с http://dabeaz.blogspot.fr/2010/02/context-manager-for-timing-benchmarks.html
источник
Используйте модуль профилировщика. Это дает очень подробный профиль.
это выводит что-то вроде:
Я нашел это очень информативным.
источник
main()
? Было бы более полезно, если бы вы могли предоставить простой пример кода.Мне нравится это просто (Python 3):
Выход составляет микросекунды за одно выполнение:
Объяснение : timeit по умолчанию выполняет анонимную функцию 1 миллион раз , а результат дается в секундах . Следовательно, результат за одно выполнение - то же самое количество, но в среднем в микросекундах .
Для медленных операций добавьте меньшее количество итераций, иначе вы можете ждать вечно:
Вывод всегда в секундах для общего количества итераций:
источник
(Только для Ipython) вы можете использовать % timeit для измерения среднего времени обработки:
а потом:
результат примерно такой:
источник
Еще один способ использовать timeit :
источник
на python3:
элегантный и короткий.
источник
Вид супер позднего ответа, но, возможно, он кому-то нужен. Это способ сделать это, который я считаю очень чистым.
Имейте в виду, что «печать» - это функция в Python 3, а не Python 2.7. Тем не менее, он работает с любой другой функцией. Ура!
источник
Вы можете использовать время.
Вот пример того, как проверить naive_func, который принимает параметр, используя Python REPL:
Вам не нужна функция-обертка, если у функции нет никаких параметров.
источник
lambda
было бы более кратким:print(timeit.timeit(lambda: naive_func(1_000), number=1_000_000))
Мы также можем преобразовать время в удобочитаемое время.
источник
Я сделал библиотеку для этого, если вы хотите измерить функцию, вы можете просто сделать это так
https://github.com/Karlheinzniebuhr/pythonbenchmark
источник
Чтобы получить рекурсивное представление о каждом вызове функции, выполните:
Он просто берет эти 2 строки кода в записной книжке Jupyter и создает красивую интерактивную диаграмму. Например:
Вот код Опять же, две строки, начинающиеся с,
%
являются единственными дополнительными строками кода, необходимыми для использования snakeviz:Также кажется возможным запустить snakeviz вне ноутбуков. Больше информации на сайте snakeviz .
источник
источник
Этот уникальный подход на основе классов предлагает печатное представление строки, настраиваемое округление и удобный доступ к прошедшему времени в виде строки или числа с плавающей запятой. Он был разработан с Python 3.7.
Применение:
источник
Измерьте время выполнения небольших фрагментов кода.
Исходные документы Python !
источник
Если вы хотите иметь возможность удобно распределять время по функциям, вы можете использовать простой декоратор:
Вы можете использовать его для функции, которую вы хотите, чтобы время, как это:
Затем каждый раз, когда вы звоните
function_to_time
, он напечатает, сколько времени это заняло, и название функции, которая была синхронизирована.источник
на основе решения contextmanager, предоставленного https://stackoverflow.com/a/30024601/5095636 , ниже предлагается бесплатная лямбда-версия, поскольку flake8 предупреждает об использовании лямбды согласно E731 :
тестовое задание:
источник
Самый простой способ рассчитать продолжительность операции:
источник
Вот довольно хорошо документированный и полностью подсказанный тип декоратор, который я использую как обычную утилиту:
Пример использования:
Докуты можно проверить с помощью:
И тип намекает на:
источник
Callable[[AnyF], AnyF]
. Что это значит?AnyF
ЗначитьCallable[..., Any]
, такAnyF
это функция , которая может принимать любое количество аргументов типа и возвращение ничего. ТакCallable[[AnyF], AnyF]
расширится доCallable[[Callable[..., Any]], Callable[..., Any]]
. Это тип возвращаемого значенияtimer
или полный типdecorator
. Это функция, которая принимает любую функцию в качестве единственного аргумента и возвращает любую функцию.