1-freelance.ru

Журнал "Фрилансер"
8 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Python Время выполнения

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

Python Время выполнения — это средство измерения времени выполнения небольших фрагментов кода, его имеет смысл применять при оптимизации программы.

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

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

Измерения производятся с помощью класса Timer. Конструктор класса имеет следующий формат:
Timer( [stmt=’pass’] [, setup=’pass’] [, timer=<timer function>])

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

Например, в параметре setup можно подключить модуль.

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

# Листинг_10.4. Измерение времени выполнения
# -*- 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: 17.26802443580117
for: 9.602403053818772
sum: 3.067899091205735

На моём ноутбуке получены такие результаты:
while: 41.55120102917928
for: 23.030579681389646
sum: 7.445543743319618

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

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

Листинг 10.5. Использование метода repeat()
# -*- 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: [9.98154294362325, 9.997541285814483, 10.004275691347512]
генератор: [7.879446040575054, 7.924527742041953, 7.844603314867392]

На моём ноутбуке получены такие результаты:
append: [27.529709871288585, 26.59919227347495, 24.542013299966086]
генератор: [17.88548844413438, 18.161865323442626, 18.18962500240015]

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

Возиться с форматированием результатов не стал, так как повторно измерять результаты не собираюсь.

При отладке программ имеет смысл сначала уменьшить number до 100, чтобы не ждать слишком долго.

Вскоре запущу эти программы на ноутбуке с более быстрым процессором — результаты доложу.

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

Приглашаю всех высказываться в Комментариях. Критику и обмен опытом одобряю и приветствую. В хороших комментариях сохраняю ссылку на сайт автора!

И не забывайте, пожалуйста, нажимать на кнопки социальных сетей, которые расположены под текстом каждой страницы сайта.
Python Время выполненияПродолжение тут…

Модуль time

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

Читайте так же:
В какой программе нарисовать план помещения

Текущее время в Python

Работа методов из модуля time основывается на общепринятой системе описания времени, которая справедлива для Unix, а также для POSIX-совместимых ОС. Согласно ее концепции, текущее время представляется в виде обыкновенного вещественного значения в секундах, прошедших с момента начала эпохи и до сегодняшнего дня. Отправной точкой для времени считается 1 января 1970 года, когда счетчик секунд имел полностью нулевое значение.

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

Как можно увидеть из данного примера, функция print получает в качестве единственного параметра число, возвращенное из метода time(), после чего выводит его на экран. Таким образом, с 1 января 1970 года прошло уже более полтора миллиарда секунд. Но подобное представление времени совсем неудобно для пользователя программы. Чтобы отобразить текущую дату в более комфортном виде, стоит передать функции print результат работы метода ctime(), не забыв произвести импорт соответствующей ему библиотеки time.

В результате выполнения вышеописанной программы на экране будут отображены точные сведения о текущем времени, которые включают в себя день недели, название месяца, его число, часы, минуты, секунды и год. Кроме того, в качестве параметра методу ctime() можно передать любое значение в секундах, полученное при помощи упомянутого ранее time().

Методы

Для работы с временем в стандартной библиотеке языка Python имеется множество самых разных методов. Наиболее популярные функции, реализованные в модуле time, описаны в следующей таблице. Здесь можно найти их название, а также краткую характеристику.

МетодХарактеристика
time()возвращает текущее время, прошедшее с начала 1970 года в секундах
ctime(s)возвращает местное время в строке или время, полученное из s секунд
clock()возвращает процессорное время, прошедшее с момента первого вызова этой функции, точность больше 1 микросекунды
sleep(s)останавливает ход выполнения программы ровно на s секунд
strftime(s)преобразует переданное в качестве аргумента время s в строку по формату
strptime(s)разбирает строку s и преобразует в объект времени по формату
mktime(s)преобразует время s в количество секунд с начала 1970 года
localtime(s)возвращает объект, представляющий местное время или время s

Форматированный вывод

Принцип работы метода ctime() заключается в представлении секундного вещественного значения в более удобном виде, благодаря автоматическому форматированию. Некоторым пользователям предложенный подобным образом вывод данных может показаться чересчур сложным для восприятия либо же недостаточно информативным. Именно поэтому методы модуля time позволяют создавать свои уникальные типы форматирования для дат. В данном случае речь пойдет о функции strftime, принимающей в качестве параметров текущее время и шаблон, который будет использоваться для форматирования полученного объекта.

В следующем примере демонстрируется вывод значения, переданного функцией localtime() в strftime. То есть, мы в Python получим текущее время и выведем его в отформатированном виде. Первым аргументом метода strftime является строка с некоторым набором правил для форматирования, каждое из которых указано при помощи символа %. В результате, на экране выводится информация, включающая название месяца, число и год.

Существует большое количество символов форматирования, отвечающих за отображение отдельных свойств объекта, представляющего собой дату. Важно запомнить, что каждое новое правило необходимо отделять знаком %. Все доступные типы форматов для вывода данных о времени подробно описаны в следующей таблице. Их можно передавать методу strftime в любом порядке, помещая в строковый литерал, который служит параметром.

ФорматСвойство
%aкороткое название дня недели
%Aполное название дня недели
%bкороткое название месяца
%Bполное название месяца
%cдата и время
%dдень месяца
%Hколичество часов в 24-часовом формате
%Iколичество часов в 12-часовом 1формате
%jдень года
%mномер месяца
%Mколичество минут
%pдо или после полудня для 12-часового формата
%Sколичество секунд
%Uномер недели в году, начиная с воскресенья
%wномер дня недели
%Wномер недели в году, начиная с понедельника
%xдата
%Xвремя
%yгод без указания века
%Yполное представление года
%Zназвание часового пояса
%%символ процента

Применение метода sleep

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

Перевести программу в ждущий режим, временно заморозив ее работу, можно при помощи метода sleep, доступного в модуле time. Его единственным аргументом является количество секунд, которое следует выждать программе, прежде чем перейти к дальнейшему шагу из прописанного алгоритма. В следующем фрагменте кода функция sleep работает 10 секунд.

Как можно увидеть из результатов выполнения кода, вначале на экран выводится стартовое сообщение, после чего программа прекращает свою работу ровно на 10 секунд, поскольку метод sleep получает переменную pause в качестве аргумента. Затем отображается последняя запись, информирующая пользователя о том, какое количество секунд длилась задержка.

Таким образом, чтобы сделать задержку в 100 миллисекунд, надо написать time.sleep(0.1) .

Время выполнения программы

Существует множество разных задач, для решения которых нужно найти время, потраченное на работу программы либо отдельных ее блоков. Чтобы найти данную величину, достаточно посчитать разницу в секундах между точкой старта определенной функции и местом, где она завершает свою работу. В следующем примере демонстрируется применение методов time() для получения текущего времени, чтобы в конечном итоге выявить, как долго работал блок кода. Метод sleep() здесь увеличивает время выполнения программы на 5 секунд.

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

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

monotonic

По этой причине лучше всего использовать метод monotonic(), впервые появившийся в версии Python 3.3 на некоторых платформах, а начиная с выпуска 3.5 ставший доступным абсолютно везде. Его главной особенностью является точное представление измеряемого количества времени, вне зависимости от работы ОС и текущей платформы. Используемый таймер никогда не вернет при повторном вызове метода значение, которое будет меньше предыдущего. Это позволяет избежать многих ошибок, а также неожиданного поведения.

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

Заключение

Используя стандартный библиотечный модуль time в Python 3, можно всячески взаимодействовать с информацией о текущем времени. Таким образом, использование библиотеки дает возможность:

Как получить время выполнения программы на Python?

У меня есть программа командной строки на Python, для завершения которой требуется некоторое время. Я хочу знать точное time , которое требуется для завершения работы.

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

25 ответов

Самый простой способ в Python:

Это предполагает, что для выполнения вашей программы требуется не менее десятой секунды.

Я помещаю этот модуль timing.py в свой собственный каталог site-packages и просто вставляю import timing в начало моего модуля:

Я также могу вызвать timing.log из моей программы, если есть значительные этапы внутри программы, которую я хочу показать. Но только в том числе import timing будет печатать время начала и окончания, а общая истекшая time. (пропустите мою непонятную secondsToStr функцию, она просто форматирует число с плавающей точкой в ​​секундах до hh: mm: ss.sss form.)

Примечание. Версия Python 3 приведенного выше кода может быть найдена здесь или здесь.

В Linux или UNIX:

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

Мне очень нравится ответ Пола МакГира, но я использую Python3. Итак, для тех, кому это интересно: вот модификация его ответа, которая работает с Python 3 на * nix (я полагаю, под Windows, что вместо time() следует использовать clock()):

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

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

Вот пример того, как профилировать скрипт, используя cProfile из командной строки:

Мне нравится вывод, предоставляемый модулем datetime , где time дельта-объекты показывают дни, часы, минуты и т.д., если необходимо, с точки зрения человека.

Пример вывода, например

Обновление: Как отметил Дж. Ф. Себастьян, этот подход может столкнуться с некоторыми сложными случаями с локальным time,, поэтому безопаснее использовать:

Еще лучше для Linux: /usr/bin/time

Обычно просто time является более простой оболочкой, которая затеняет более способную /usr/bin/time .

Решение rogeriopvl отлично работает, но если вы хотите получить более конкретную информацию, вы можете использовать встроенный профилировщик python. Проверьте эту страницу:

профилировщик сообщает вам много полезной информации, такой как time , затраченная на каждую функцию

Следующий фрагмент распечатывает прошедшее время в удобном для человека формате <HH:MM:SS> .

Устаревший с версии 3.3: поведение этой функции зависит на платформе: вместо этого используйте perf_counter() или process_time()в зависимости от ваших требований, чтобы иметь четко определенное поведение.

<сильный > time. perf_counter()

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

<сильный > time. process_time()

Возвращает значение (в дробных секундах) суммы системы и пользовательский CPU time текущего процесса. Он не включает time истекший во время сна.

Ipython «timeit» любой script:

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

Он запускает your_module.main() функцию one time и печатает прошедший time с помощью функции time.time() в качестве таймера.

Чтобы измерить CPU time (например, не включать time в течение time.sleep() ) для каждой функции, вы можете использовать модуль profile ( cProfile на Python 2):

Вы можете передать команду -p в timeit выше, если вы хотите использовать тот же таймер, что и модуль profile .

Просто используйте timeit модуль. Он работает как с Python 2, так и с Python 3

Он возвращается в секундах, и вы можете выполнить свое выполнение Time. Simple, но вы должны написать их в главной функции, которая запускает выполнение программы. Если вы хотите получить Execution time , даже когда вы получите ошибку, тогда возьмите свой параметр «Начать» и подсчитайте там, как

Мне также нравится ответ Пола МакГира и придумал форму менеджера контекста, которая соответствовала моим потребностям.

Существует модуль timeit который можно использовать для определения времени выполнения кодов Python. Он содержит подробную документацию и примеры в документации по python (https://docs.python.org/2/library/timeit.html).

line_profiler будет профилировать время выполнения отдельных строк кода. Профилировщик реализован в C через Cython, чтобы уменьшить накладные расходы на профилирование.

Для данных людей, использующих ноутбуки Jupyter

В ячейке вы можете использовать магическую команду Jupyter %%time для измерения времени выполнения:

Выход
Время процессора: пользовательский 4,54 мс, sys: 0 нс, всего: 4,54 мс
Время стены: 4,12 мс

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

Предположим, что записная книжка выше называется example_notebook.ipynb . В новой записной книжке в том же каталоге:

Выход
Время загрузки процессора IPython (по оценкам): Пользователь: 0,00 с.
Система: 0,00 с.
Время стены: 0,00 с.

Timeit — это класс в python, используемый для вычисления выполнения time небольших блоков кода.

Default_timer — это метод в этом классе, который используется для измерения времени настенных часов, а не выполнения ЦП time.. Таким образом, другое выполнение процесса может помешать этому. Таким образом, это полезно для небольших блоков кода.

Образец кода выглядит следующим образом:

Это ответ Paul McGuire, который работает для меня. На всякий случай у кого-то возникли проблемы с запуском этого.

вызывать timing.main() из вашей программы после импорта файла.

Чтобы использовать обновленный ответ metakermit для python 2.7, вам потребуется monotonic.

Тогда код будет выглядеть следующим образом:

Если вы хотите измерять время в микросекундах, то вы можете использовать следующую версию, полностью основанную на ответах Пола Макгуайра и Никохо, — это код Python3. Я также добавил немного цвета к нему:

log() => функция, которая печатает информацию о времени.

txt ==> первый аргумент в логе и строка для отметки времени.

atexit ==> модуль python для регистрации функций, которые вы можете вызывать при выходе из программы.

Я использовал очень простую функцию для определения времени выполнения кода:

И чтобы использовать его, просто вызовите его перед кодом для измерения, чтобы получить функцию синхронизации, затем вызовите функцию после кода с комментариями, и перед комментариями появится время, например:

Тогда вывод будет выглядеть так:

Я чувствую себя немного элегантно в этом смысле.

time меры выполнения программы Python может быть непоследовательной в зависимости от:

  • Та же программа может быть оценена с использованием разных алгоритмов
  • Запуск time изменяется между алгоритмами
  • Запуск time зависит от реализации
  • Запуск time варьируется между компьютерами
  • Запуск time не предсказуем на основе небольших входов

Это связано с тем, что наиболее эффективным способом является использование «Ордена роста» и изучение записи «Большой буквы», чтобы сделать это правильно, https://en.wikipedia.org/wiki/Big_O_notation

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

Python. Прервать выполнение скрипта по времени

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

Рабочая среда: Linux Mint + Python (версия 2.7.12).

Программист: я — непрофессионал в Python. За всю жизнь написал на нём меньше тысячи строк кода. Поэтому формулировки могут быть неточными. Изучать Python не хочу, потому что использую его для очень простых задач.

Методы: Реализуем прерывание через библиотеку «signal». Потому что это самый простой способ.

Прерывание выполнения скрипта по времени

Возьмём простую тестовую программу:

#!/usr/bin/python -i
import time
try:

time.sleep(5)

except Exception as e:

print e

Здесь time.sleep(5) — это пятисекундная задержка. Она будет выполнять роль функции, которая может исполняться очень долго. И нам необходимо ограничить время её выполнения — прервать через 2 секунды.

Воспользуемся библиотекой «signal». Signal представляет собой таймер, который будет считаться в фоновом режиме, параллельно с программой. На работу Signal не влияет ничего, в том числе задержка через time.sleep(5) . Signal сработает (выдаст Exception) в любом случае, как только таймер отсчитает нужное количество секунд.

Синтаксис команды прост:

signal.alarm(N) — запускает таймер сигнала на N секунд

signal.alarm(0) — останавливает таймер.

Вставим signal в пример:

#!/usr/bin/python -i
import signal
import time
try:

signal.alarm(2)
time.sleep(5)
signal.alarm(0)

except Exception as e:

print e

Посмотрим внимательнее на скрипт. Сначала запускается двухсекундный отсчёт signal.alarm(2) , затем пятисекундная задержка time.sleep(5) . В конце выполняется команда signal.alarm(0) , которая останавливает отсчёт до срабатывания сигнала.

Как можно догадаться, с таким скриптом Exception всегда будет срабатывать. Потому что задержка в 5 секунд выполняется дольше, чем время ожидания сигнала в 2 секунды.

Попробуйте изменить время сна с time.sleep(5) на time.sleep(1) . И Exception не будет происходить.

Специфический ответ от signal

В приведённом примере во время вызова Exception в переменной «e» будет находиться текст «Сигнал таймера». Это не информативно. Но есть способ задать этот текст:

#!/usr/bin/python -i
import signal
import time

def signal_handler(signum, frame):

raise Exception(» Script is too slow! «)

signal.signal(signal.SIGALRM, signal_handler)

try:

signal.alarm(2)
time.sleep(5)
signal.alarm(0)

except Exception as e:

print e

Теперь во время прерывания будет печататься текст » Script is too slow! «.

Заключение

Если вам понадобится ограничить время работы python скрипта, то легче всего это можно сделать через «signal» библиотеку.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector