21

Как измерить прошедшее время в Python?

17

Я хочу измерить время выполнения функции. Не смог заставить работать модуль timeit:

import timeit
start = timeit.timeit()
print("hello")
end = timeit.timeit()
print(end - start)

При запуске этого кода возникает ошибка. Как правильно использовать timeit для измерения времени работы функции?

5 ответ(ов)

2

Для измерения времени выполнения кода в секундах вы можете использовать следующий пример на 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 секунды.

0

Вот еще один контекстный менеджер для измерения времени выполнения кода.

Использование:

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

0

Вы можете использовать следующий код для измерения времени выполнения вашего кода без использования timeit, если вам более удобен этот способ. Вот пример:

from datetime import datetime 

start_time = datetime.now() 

# ВСТАВЬТЕ ВАШ КОД 

time_elapsed = datetime.now() - start_time 

print('Время выполнения (чч:мм:сс.мс) {}'.format(time_elapsed))

Обратите внимание, что в этом примере я просто вывел чч:мм:сс, чтобы вы могли интерпретировать time_elapsed. В этом коде нет никакого форматирования времени, и он должен быть понятен и прост для использования.

0

Для выполнения замеров времени в 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 секунду из-за накладных расходов на выполнение кода.

0

Модули 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)

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь