Как узнать время работы программы python
Перейти к содержимому

Как узнать время работы программы python

  • автор:

Измерение времени выполнения программы на Python

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

Алексей Кодов
Автор статьи

Баннер Баннер

7 июля 2023 в 17:13

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

В Python для измерения времени выполнения кода часто используется модуль timeit . Однако, он обычно применяется для измерения времени выполнения небольших фрагментов кода, а не всей программы. Как же можно измерить время выполнения всей программы?

Использование модуля time

Самый простой способ измерить время выполнения программы — использовать модуль time . В основе этого подхода лежит идея о том, что нужно зафиксировать время в момент начала выполнения программы, а затем, когда программа закончит работу, снова зафиксировать время и вычесть из него время начала. Разница между конечным и начальным временем и будет временем выполнения программы.

Пример кода, который демонстрирует этот подход:

import time start_time = time.time() # время начала выполнения # ваш код end_time = time.time() # время окончания выполнения execution_time = end_time - start_time # вычисляем время выполнения print(f"Время выполнения программы: секунд")

В этом примере функция time() модуля time возвращает текущее время в секундах с начала эпохи (обычно это 00:00:00 1 января 1970 года).

Использование модуля datetime

Альтернативный подход — использовать модуль datetime . Этот подход аналогичен предыдущему, но вместо функции time() используется функция datetime.now() . Пример кода:

from datetime import datetime start_time = datetime.now() # время начала выполнения # ваш код end_time = datetime.now() # время окончания выполнения execution_time = end_time - start_time # вычисляем время выполнения print(f"Время выполнения программы: секунд")

В этом примере функция datetime.now() возвращает текущее дату и время, а разница между конечным и начальным временем вычисляется как разность между двумя объектами datetime .

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

Измерение времени выполнения скрипта#

Для оценки времени выполнения скрипта есть несколько вариантов. Тут используются самые простые варианты:

  • утилита Linux time
  • и модуль Python datetime

При оценке времени выполнения скрипта в данном случае не важна высокая точность. Главное — сравнить время выполнения скрипта в разных вариантах.

time #

Утилита time в Linux позволяет замерить время выполнения скрипта. Для использования утилиты time достаточно написать time перед строкой запуска скрипта:

$ time python thread_paramiko.py . real 0m4.712s user 0m0.336s sys 0m0.064s

Нас интересует real время. В данном случае это 4.7 секунд.

datetime #

Второй вариант — модуль datetime. Этот модуль позволяет работать со временем и датами в Python.

from datetime import datetime import time start_time = datetime.now() #Тут выполняются действия time.sleep(5) print(datetime.now() - start_time) 
$ python test.py 0:00:05.004949

Измерение времени выполнения кода в Python

Баннер Баннер

Возникает задача измерить время, которое занимает выполнение определенного участка кода или функции в Python. Например, есть функция, которая выполняет сложные вычисления, и нужно выяснить, сколько времени она занимает.

Модуль time

Одним из способов измерения времени выполнения кода в Python является использование модуля time . Этот модуль предоставляет функцию time() , которая возвращает текущее время в секундах с момента, который называется «эпохой». Обычно это 00:00 1 января 1970 года.

import time # начальное время start_time = time.time() # код, время выполнения которого нужно измерить for i in range(0, 1000000): pass # конечное время end_time = time.time() # разница между конечным и начальным временем elapsed_time = end_time - start_time print('Elapsed time: ', elapsed_time)

Модуль timeit

Другим способом является использование модуля timeit . Этот модуль предоставляет более точный способ измерения времени выполнения кода, поскольку он автоматически учитывает время, которое занимает вызов функции time() и другие факторы. Вместо этого timeit многократно выполняет код и возвращает среднее время выполнения.

import timeit # код, время выполнения которого нужно измерить code_to_test = """ a = range(1000000) b = [] for i in a: b.append(i*2) """ # вычисление времени выполнения кода elapsed_time = timeit.timeit(code_to_test, number=100)/100 print('Elapsed time: ', elapsed_time)

В приведенном примере timeit() выполняет код 100 раз и возвращает общее время выполнения. Затем это время делится на 100, чтобы получить среднее время выполнения.

6 способов измерить скорость программы на Python

Недавно мы решали сложную задачу Эйнштейна с помощью кода на Python, а потом оптимизировали его, чтобы сократить время выполнения. Там всё было просто: с четырёх часов мы оптимизировали время выполнения до долей секунды, и это было явно заметно. Но бывает так, что даже полсекунды оптимизации — это очень хорошо, когда речь идёт о высоконагруженных сервисах. Например, в соцсетях, которыми пользуются сотни тысяч пользователей в минуту. Сегодня мы покажем целых 6 простых способов измерения времени работы кода, которые может использовать каждый.

Как измерять время выполнения кода

В большинстве случаев измерить время работы кода можно так:

  1. Зафиксировать время начала работы.
  2. Зафиксировать время окончания работы.
  3. Вычесть первое значение из второго.

Ещё важно измерять время выполнения кода при одних и тех же условиях:

  • конфигурация и мощность компьютера должны совпадать для всех замеров;
  • загрузка процессора должна быть одинаковой;
  • программа для работы с кодом должна быть одной и той же с одинаковой версией.

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

Если будете заниматься оптимизацией, вот вам на вырост: нужно различать понятия wall time («время на стене») и процессорное время. Первое показывает прошедшее время от начала до конца работы, второе — время, которое процессор затратил на выполнение кода. Их значения могут различаться, если программа ожидает высвобождение ресурсов для выполнения. Но сейчас можно без этих тонкостей.

Модуль datetime

С помощью такого способа можно измерить время выполнения кода в формате часы:минуты:секунды:микросекунды. Мы использовали модуль datetime, когда оптимизировали код для решения загадки Эйнштейна и ускоряли работу программы более чем в 200 тысяч раз.

# подключаем модуль datetime import datetime # фиксируем и выводим время старта работы кода start = datetime.datetime.now() print('Время старта: ' + str(start)) # код, время работы которого измеряем #фиксируем и выводим время окончания работы кода finish = datetime.datetime.now() print('Время окончания: ' + str(finish)) # вычитаем время старта из времени окончания print('Время работы: ' + str(finish - start))

Результат — 51 тысячная секунды. Неплохо, но что покажут другие способы?

6 способов измерить скорость программы на Python

Модуль time

Модуль time предоставляет разные возможности для измерения времени работы кода:

  • time.time() поможет измерить время работы в секундах. Если нужно получить время в минутах, результат вычисления нужно разделить на 60, в миллисекундах — умножить на 1000.
  • time.perf_counter() также можно использовать для измерения времени в секундах, но таймер не будет зависеть от системных часов. Функцию используют, чтобы избежать погрешностей. Функция time.perf_counter_ns() вернёт значение в наносекундах.
  • time.monotonic() подходит для больших программ, поскольку эта функция не зависит от корректировки времени системы. Функция использует отдельный таймер, как и time.perf_counter(), но имеет более низкое разрешение. С помощью time.monotonic_ns() можно получить результат в наносекундах.
  • time.process_time() поможет получить сумму системного и пользовательского процессорного времени в секундах, не включая время сна. Если процесс выполнения блокируется функцией time.sleep() или приостанавливается операционной системой, это время не включается в отчётное. Для наносекунд есть функция time.process_time_ns(), но её поддерживают не все платформы.
  • time.thread_time() сообщит время выполнения текущего потока, а не процесса. Если в коде есть функция time.sleep(), время её выполнения не будет включено.

Time.time(). Давайте посчитаем время выполнения нашего кода с помощью функции time.time() в миллисекундах:

# подключаем модуль time import time # фиксируем время старта работы кода start = time.time() # код, время работы которого измеряем #фиксируем время окончания работы кода finish = time.time() # вычитаем время старта из времени окончания и получаем результат в миллисекундах res = finish - start res_msec = res * 1000 print('Время работы в миллисекундах: ', res_msec)

Получаем результат: 61 тысячная секунды. Результат отличается от предыдущего, тут уже нужно было бы хорошо сделать серию тестов и посчитать среднее значение.

6 способов измерить скорость программы на Python

Time.perf_counter(). Посчитаем время выполнения нашего кода с помощью функции time.perf_counter() в секундах:

# подключаем модуль time import time # фиксируем время старта работы кода start = time.perf_counter() # код, время работы которого измеряем #фиксируем время окончания работы кода finish = time.perf_counter() # вычитаем время старта из времени окончания и выводим результат print('Время работы: ' + str(finish - start))

Мы получили 51 тысячную секунды — почти такой же результат, как и в самый первый раз. Кажется, что это точное время, но посмотрим, что будет дальше.

6 способов измерить скорость программы на Python

Time.monotonic_ns(). Посчитаем время выполнения нашего кода с помощью функции time.monotonic_ns() в наносекундах:

# подключаем модуль time import time # фиксируем время старта работы кода start = time.monotonic_ns() # код, время работы которого измеряем #фиксируем время окончания работы кода finish = time.monotonic_ns() # вычитаем время старта из времени окончания и получаем результат в наносекундах print('Время работы в наносекундах: ' + str(finish - start))

Результат примерно такой же — 52 тысячные секунды, но количество цифр в результате меньше, чем в предыдущем случае.

6 способов измерить скорость программы на Python

Time.process_time(). Посчитаем сумму системного и пользовательского процессорного времени в секундах:

# подключаем модуль time import time # фиксируем время старта работы кода start = time.process_time() # код, время работы которого измеряем #фиксируем время окончания работы кода finish = time.process_time() # вычитаем время старта из времени окончания и выводим результат print('Время работы: ' + str(finish - start))

Время работы снова выросло — с 51 до 62 тысячных секунды. Для одних программ такой разброс вообще некритичен, а для других это может означать, что нужно провести больше тестов.

6 способов измерить скорость программы на Python

Time.thread_time(). Наконец, посчитаем время выполнения кода с помощью time.thread_time():

# подключаем модуль time import time # фиксируем время старта работы кода start = time.thread_time() # код, время работы которого измеряем #фиксируем время окончания работы кода finish = time.thread_time() # вычитаем время старта из времени окончания и выводим результат print('Время работы: ' + str(finish - start))

Время работы снова выглядит правдоподобно в сравнении с предыдущим результатом.

6 способов измерить скорость программы на Python

Что дальше

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *