Python как измерить время выполнения кода
Перейти к содержимому

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

  • автор:

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

Допустим, вы хотите знать время выполнения следующего кода Python:

a = range(100000) b = [] for i in a: b.append(i*2)

Есть несколько способов измерить время, необходимое для выполнения скрипта Python, но вот лучший способ сделать это, и я объясню почему:

import timeit code_to_test = """ a = range(100000) b = [] for i in a: b.append(i*2) """ elapsed_time = timeit.timeit(code_to_test, number=100)/100 print(elapsed_time)

В консоли получим: 0.01137321546

Это вывод, который я получаю на своем Macbook Pro. Итак, это более или менее 1/100 секунды.

Как работает вышеуказанный скрипт

Строка 1: мы импортируем модуль timeit . Строка 3: мы создаем переменную. В этой переменной мы храним код, который хотим протестировать. Этот код должен идти внутри тройных кавычек. Итак, тестовый код предоставляется в виде строки. Строка 10: мы вызываем функцию time.timeit() . Функция timeit() получает тестовый код в качестве аргумента, выполняет его и записывает время выполнения. Чтобы получить точное время, я приказал timeit() выполнить 100 циклов. Поэтому мне пришлось разделить вывод на 100, чтобы получить время выполнения только для одного цикла. Строка 11: мы просто распечатываем время выполнения. Результат — время выполнения в секундах.

Почему timeit() — лучший способ измерить время выполнения кода Python?

1. timeit() автоматически будет использовать time.clock() или time.time() для вас в фоновом режиме, в зависимости от того, какая операционная система вам нужна для получения наиболее точных результатов.

2. timeit() отключает сборщик мусора, который может исказить результаты.

3. timeit() повторяет тест много раз (в нашем случае 100 раз), чтобы минимизировать влияние других задач, выполняемых в вашей операционной системе.

Упражнение:

Кстати, код, который мы тестировали выше, строит список путем умножения элементов другого списка. Я могу достичь того же результата, используя range :

a = range(100000) b = [i*2 for i in a] 

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

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

Источник:

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

print(«— %s seconds —» % (time.time() — start_time))

Более безопасный способ, потому что time.monotonic() никогда не идёт назад, даже если на машине будет переведено время:

from datetime import timedelta

  • Закодировать файл в base64 на Python
  • Рекурсивное создание директорий в Python
  • Сортировка в Python
  • Правильно добавить год/месяц к дате в Python
  • Отформатировать дату в Python
  • Получить рабочую директорию и директорию со скриптом в Python
  • Копия объекта в Python
  • Время выполнения программы на Python
  • Конвертировать datetime.timedelta в строку
  • Парсинг даты в Python
  • Конвертировать строку (str) в булевый тип (bool) в Python
  • Получить местный часовой пояс в Python
  • Проверить, что строка соответствует регулярному выражению в Python
  • Просмотреть доступные версии модулей в PIP
  • Получить целочисленный Unix timestamp в Python
  • getter и setter в Python
  • Настроить формат вывода логов в Python
  • Получить переменную окружения в Python
  • Обновить пакет в PIP
  • Получить имя (хостнейм) машины из Python
  • Вывести стэк вызовов при возникновении исключения в Python
  • Функция eval в Python
  • Дозаписывать (append) в файл в Python
  • Препроцессинг кода в Python
  • Проверить, что программа установлена из Python
  • Настроить путь для импорта библиотек в Python
  • Получить размер терминала в символах в Python
  • Enum с дополнительными полями в Python
  • Ошибка invalid command ‘bdist_wheel’ при установке пакета через PIP
  • Получить список аргументов функции из Python
  • Сделать словарь только для чтения в Python
  • Заматчить любой символ, включая перевод строки, в регулярных выражениях на Python
  • Получить список файлов в директории через pathlib в Python
  • Вывести действительное число с округлением до нескольких символов после запятой в Python
  • Вывод в терминал текста с цветами в Python
  • Перезагрузить импортированный модуль в Python
  • Безопасно создать список/словарь/любой объект из строкового представления в Python
  • Аналог декоратора @property для методов класса в Python
  • Перехватить ошибку TimeoutError в asyncio
  • Отключить вывод логов в Python
  • Уровни логгирования в Python
  • Удалить *.pyc и __pycache__ файлы
  • Выгрузить объект в JSON в Unicode в Python
  • Конвертировать datetime в другую часовую зону в Python
  • Дополнить строку нулями в Python
  • Вычислить MD5 от строки в Python
  • Удалить знаки пунктуации из строки в Python
  • Проверить, что первая буква в строке — заглавная, в Python
  • Разбить (split) строку по нескольким разделителям в Python
  • Отсортировать версии в Python
  • Распаковать любой архив в Python
  • Получить имя текущего скрипта на Python
  • Установка pip на Python 2.6
  • Отличить печатаемый символ Unicode от непечатаемого на Python
  • Вывести версию интерпретатора Python в машиночитаемом виде
  • Найти место, куда Python устанавливает пакеты (dist-packages, site-packages)

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

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

  • утилита 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 как измерить время выполнения кода

На этом шаге мы рассмотрим использование модуля timeit .

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

from timeit import Timer

Измерения производятся с помощью класса Timer . Конструктор класса имеет следующий формат:

Timer([stmt='pass'][, setup='pass'][, timer=])

В параметре stmt указывается код (в виде строки), время выполнения которого предполагается измерить. Параметр setup позволяет указать код, который будет выполнен перед измерением времени выполнения кода в параметре stmt . Например, в параметре setup можно подключить модуль.

Получить время выполнения можно с помощью метода timeit ([number=1000000]) . В параметре number указывается количество повторений. Для примера просуммируем числа от 1 до 10000 тремя способами и выведем время выполнения каждого способа.

#-*- coding: utf-8 -*- from timeit import Timer code1 = """\ i, j = 1, 0 while i < 10001: j += i i += 1 """t1 = Timer(stmt=code1) print("while:", t1.timeit(number=10000)) code2 = """\ j = 0 for i in range(1, 10001): j += i """ t2 = Timer(stmt=code2) print("for:", t2.timeit(number=10000)) code3 = """\ j = sum (range(1, 10001)) """ t3 = Timer(stmt=code3) print("sum:", t3.timeit(number=10000)) input ()

Архив с файлом можно взять здесь.

Примерный результат выполнения (зависит от мощности компьютера):

while: 25.13958657675797 for: 14.858756346126274 sum: 5.050326964385583 

Как видно из результата, цикл for работает почти в два раза быстрее цикла while , а функция sum () в данном случае является самым оптимальным решением задачи.

Метод repeat ([repeat=3] [, number=1000000]) вызывает метод timeit () указанное количество раз (задается в параметре repeat ) и возвращает список значений. Аргумент number передается в качестве параметра методу timeit () . Для примера создадим список со строковыми представлениями чисел от 1 до 10000. В первом случае для создания списка используем цикл for и метод append () , а во втором — генератор списков.

# -*- coding: utf-8 -*- from timeit import Timer code1 = """\ arr1 = [] for i in range(1, 10001): arr1.append(str(i)) """ t1 = Timer(stmt=code1) print("append:", t1.repeat(repeat=3, number=2000)) code2 = """\ arr2 = [str(i) for i >in range(1, 10001)] """ t2 = Timer(stmt=code2) print("генератор:", t2.repeat(repeat=3, number=2000)) input()

Архив с файлом можно взять здесь.

Примерный результат выполнения:

append: [12.780722522318046, 12.724886804338505, 12.903999274243034] генератор: [10.290514465192551, 10.268080216531082, 10.219959743593058] 

Как видно из результата, генераторы списков работают быстрее.

Со следующего шага мы начнем рассматривать пользовательские функции .

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

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