Как измерить прошедшее время в Python?
Я хочу измерить время выполнения функции. Не смог заставить работать модуль timeit
:
import timeit
start = timeit.timeit()
print("hello")
end = timeit.timeit()
print(end - start)
При запуске этого кода возникает ошибка. Как правильно использовать timeit
для измерения времени работы функции?
5 ответ(ов)
Для измерения времени выполнения кода в секундах вы можете использовать следующий пример на Python:
from timeit import default_timer as timer
from datetime import timedelta
start = timer()
# ....
# (здесь выполняется ваш код)
# ...
end = timer()
print(timedelta(seconds=end-start))
Этот код использует модуль timeit
для получения точного времени начала и окончания выполнения вашего кода. Затем он вычисляет разницу и выводит результат в виде объекта timedelta
, который отображает прошедшее время.
Вывод:
0:00:01.946339
Такой вывод означает, что выполнение вашего кода заняло 1.946339 секунды.
Вот еще один контекстный менеджер для измерения времени выполнения кода.
Использование:
from benchmark import benchmark
with benchmark("Тест 1+1"):
1 + 1
# Вывод:
# Тест 1+1 : 1.41e-06 секунд
А если вам нужно значение времени:
with benchmark("Тест 1+1") as b:
1 + 1
print(b.time)
# Вывод:
# Тест 1+1 : 7.05e-07 секунд
# 7.05233786763e-07
benchmark.py:
from timeit import default_timer as timer
class benchmark(object):
def __init__(self, msg, fmt="%0.3g"):
self.msg = msg
self.fmt = fmt
def __enter__(self):
self.start = timer()
return self
def __exit__(self, *args):
t = timer() - self.start
print(("%s : " + self.fmt + " seconds") % (self.msg, t))
self.time = t
Адаптировано с сайта http://dabeaz.blogspot.fr/2010/02/context-manager-for-timing-benchmarks.html
Вы можете использовать следующий код для измерения времени выполнения вашего кода без использования timeit
, если вам более удобен этот способ. Вот пример:
from datetime import datetime
start_time = datetime.now()
# ВСТАВЬТЕ ВАШ КОД
time_elapsed = datetime.now() - start_time
print('Время выполнения (чч:мм:сс.мс) {}'.format(time_elapsed))
Обратите внимание, что в этом примере я просто вывел чч:мм:сс
, чтобы вы могли интерпретировать time_elapsed
. В этом коде нет никакого форматирования времени, и он должен быть понятен и прост для использования.
Для выполнения замеров времени в Python 3 вы можете воспользоваться модулем time
. Вот краткий и лаконичный пример использования функции sleep
и perf_counter
для измерения времени задержки:
from time import sleep, perf_counter as pc
t0 = pc()
sleep(1) # Задержка на 1 секунду
print(pc() - t0) # Выводим прошедшее время
При запуске этого кода вы получите время задержки, например:
1.001345009999568
Это время может немного превышать 1 секунду из-за накладных расходов на выполнение кода.
Модули Python cProfile и pstats предлагают отличные возможности для измерения времени выполнения определённых функций, не требуя добавления какого-либо кода вокруг уже существующих функций.
Например, если у вас есть скрипт на Python timeFunctions.py
:
import time
def hello():
print("Hello :)")
time.sleep(0.1)
def thankyou():
print("Thank you!")
time.sleep(0.05)
for idx in range(10):
hello()
for idx in range(100):
thankyou()
Чтобы запустить профилирование и сгенерировать статистику для этого файла, вы можете просто выполнить команду:
python -m cProfile -o timeStats.profile timeFunctions.py
Эта команда использует модуль cProfile для профилирования всех функций в timeFunctions.py
и собирает статистику в файл timeStats.profile
. Обратите внимание, что нам не нужно было добавлять никакой код в существующий модуль (timeFunctions.py), и это можно сделать с любым модулем.
После того как у вас есть файл со статистикой, вы можете запустить модуль pstats следующим образом:
python -m pstats timeStats.profile
Эта команда запускает интерактивный браузер статистики, который предлагает множество удобных функций. Для вашего конкретного случая вы можете просто проверить статистику для ваших функций. В нашем примере проверка статистики для обеих функций покажет следующее:
Welcome to the profile statistics browser.
timeStats.profile% stats hello
<timestamp> timeStats.profile
224 function calls in 6.014 seconds
Random listing order was used
List reduced from 6 to 1 due to restriction <'hello'>
ncalls tottime percall cumtime percall filename:lineno(function)
10 0.000 0.000 1.001 0.100 timeFunctions.py:3(hello)
timeStats.profile% stats thankyou
<timestamp> timeStats.profile
224 function calls in 6.014 seconds
Random listing order was used
List reduced from 6 to 1 due to restriction <'thankyou'>
ncalls tottime percall cumtime percall filename:lineno(function)
100 0.002 0.000 5.012 0.050 timeFunctions.py:7(thankyou)
Этот простой пример не делает многого, но даёт представление о том, что можно сделать. Лучшая часть этого подхода заключается в том, что мне не нужно редактировать ни одной строчки моего существующего кода, чтобы получить эти данные, что, безусловно, помогает в процессе профилирования.
Самый быстрый способ проверить наличие значения в списке
Получить различия между двумя списками с уникальными элементами
Удаление строки DataFrame в Pandas на основе значения столбца
Почему код Python выполняется быстрее в функции?
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе