Больше модулей для работы с временем и датой, измерение времени выполнения программы
Модуль time
Для использования: import time
В Python помимо встроенного модуля datetime есть еще модуль time, который обычно используется для работы с текущим временем.
Его работа основывается на общепринятой системе описания времени. Согласно ее концепции, текущее время представляется в виде обыкновенного вещественного значения в секундах, прошедших с момента начала эпохи (полночь 1 января 1970 года) и до сегодняшнего дня.
Возможности модуля:
отображает информацию о времени, прошедшем с начала эпохи
преобразовывает значение системного времени в удобный вид
прерывает выполнение программы на заданное количество секунд
измеряет время выполнения программы или её отдельных модулей
Инфо
datetime.time и модуль time – не одно и то же!
Функция time()
Возвращает количество секунд, прошедших с начала эпохи:
1
2
3
4
5
6
importtimeseconds=time.time()# получаем количество прошедших секунд в виде float числаprint('Количество секунд с начала эпохи =',seconds)# Вывод: Количество секунд с начала эпохи = 1630387918.354396
Функция ctime()
Для того чтобы получить текущую дату в более удобном для человека виде, нужно использовать функцию ctime(), которая принимает в качестве аргумента количество секунд, прошедших с начала эпохи, и возвращает строку, представляющую собой локальное время:
1
2
3
4
5
6
7
importtimelocal_time=time.ctime(time.time())# аналогично local_time = time.ctime()print(local_time)# Вывод: текущая дата и время на вашем пк
Инфо
Если вызвать ctime() без аргументов, результат будет аналогичным
Функция sleep()
Используется для добавления задержки в выполнение программы. В качестве аргумента принимает количество секунд (secs) – задержка в секундах. secs может быть как int, так и float
1
2
3
4
5
importtimeprint('Before the sleep statement')time.sleep(3)print('After the sleep statement')
Инфо
Функция sleep() нередко используется для тестирования кода и намеренного внесения задержек на различных этапах выполнения программы
Измерение времени выполнения программы
Чтобы найти время выполнения программы или её части, достаточно посчитать разницу времени в секундах между точкой старта и местом, где она завершается.
Пример:
1
2
3
4
5
6
7
8
9
10
11
12
13
importtimestart_time=time.time()foriinrange(5):time.sleep(1)end_time=time.time()elapsed_time=end_time-start_timeprint(f'Время работы программы = {elapsed_time}')# Вывод: Время работы программы = 5.022884845733643
Несмотря на простоту вышеописанного подхода, использовать его в серьезных целях, где требуется точный и независимый от операционной системы (ОС) результат, не рекомендуется. Всё дело в том, что числовое значение времени, получаемое таким образом, может иметь погрешности за счет внутренних особенностей работы компьютера, в среде которого выполняется программа. Более того, системные часы могут быть подкорректированы вручную пользователем во время выполнения программы.
Инфо
Бывает так, что очередной вызов функции time() вернет значение меньше, чем значение, полученное при предыдущем вызове.
Функция monotonic()
Для измерения времени выполнения программы идеально подходит функция monotonic(), так как ее результат не зависит от корректировки системных часов и других внешних условий.
1
2
3
4
5
6
7
8
9
10
11
12
13
importtimestart_time=time.monotonic()foriinrange(5):time.sleep(1)end_time=time.monotonic()elapsed_time=end_time-start_timeprint(f'Время работы программы = {elapsed_time}')# Вывод: Время работы программы = 5.0
Функция perf_counter()
Для самого точного измерения времени выполнения программы следует использовать функцию perf_counter(). Данная функция использует таймер с наибольшим доступным разрешением, что делает эту функцию отличным инструментом для измерения времени выполнения кода на коротких интервалах.
1
2
3
4
5
6
7
8
9
10
11
12
13
importtimestart_time=time.perf_counter()foriinrange(5):time.sleep(1)end_time=time.perf_counter()elapsed_time=end_time-start_timeprint(f'Время работы программы = {elapsed_time}')# Вывод: Время работы программы = 5.042140900040977
Замечания
При сравнении разных способов выполнить одно и то же действие, было замерено время выполнения каждого. Вот некоторые интересные замечания, которые мне хотелось бы выделить:
По сравнению с собственными реализациями, функция factorial() из модуля math выполняется быстрее, так как реализована на языке C.
Списочные выражения (или же list comprehensions) выполняются быстрее, чем использование цикла for на пару с методом append.
В случае если требуется создать список на основе итерируемого объекта или коллекции без какого-либо изменения элементов, то лучшим вариантом будет функция list().
Тип данных struct_time
Единственный тип данных, который имеется в модуле time – struct_time. Он представляет собой именованный кортеж, содержащий информацию о времени. Структура представления времени struct_time чем-то похожа на уже изученный тип datetime.
Сделать
Именованные кортежи будут описаны подробнее в следующих конспектах
Именованный кортеж struct_time состоит из следующих атрибутов:
На практике же редко приходится собственноручно создавать объекты этого типа. Обычно используют функции модуля time, которые сами создают и оперируют ими.
Функция localtime()
localtime() принимает в качестве аргумента количество секунд, прошедших с начала эпохи, и возвращает кортеж struct_time в локальном времени.
Инфо
Если функции localtime() передан аргумент None, вернется значение time()
Также мы могли бы обращаться к данным именованного кортежа по индексам. К примеру, print('Год:', result[0]), вывел бы ту же строку, что и print('Год:', result.tm_year) в коде выше.
Функция gmtime()
gmtime() принимает в качестве аргумента количество секунд, прошедших с начала эпохи, и возвращает кортеж struct_time в UTC.
Инфо
Если функции gmtime() передан аргумент None, также вернется значение time()
Функция mktime()
mktime() принимает struct_time (или кортеж, содержащий 9 значений, относящихся к этому типу) в качестве аргумента и возвращает количество секунд, прошедших с начала эпохи, в местном времени.
1
2
3
4
5
6
7
importtimetime_tuple=(2021,8,31,5,31,58,1,243,0)time_obj=time.mktime(time_tuple)print('Локальное время в секундах:',time_obj)# Вывод: Локальное время в секундах: 1630377118.0
Функция mktime() является обратной к функции localtime(). Посмотрим на пример этой связи:
1
2
3
4
5
6
7
8
9
importtimeseconds=1630377118time_obj=time.localtime(seconds)# возвращает struct_timeprint(time_obj)time_seconds=time.mktime(time_obj)# возвращает секунды из struct_timeprint(time_seconds)
Если кортеж с неправильной длиной или имеющий элементы неправильного типа передаётся функции, ожидающей struct_time, возникает ошибка TypeError!
Функция asctime()
asctime() принимает struct_time (или кортеж, содержащий 9 значений, относящихся к этому типу) в качестве аргумента и возвращает строку, представляющую собой дату и время.
1
2
3
4
5
6
7
8
importtimetime_tuple=(2021,8,31,5,31,58,1,243,0)result=time.asctime(time_tuple)print('Результат:',result)# Вывод: Результат: Tue Aug 31 05:31:58 2021
Форматированный вывод
Функции ctime() и asctime() имеют практически одинаковый функционал, за тем исключением, что первая функция принимает количество прошедших от начала эпохи секунд, а вторая принимает struct_time (или соответствующий кортеж). Обе функции представляют время в более удобном виде, благодаря автоматическому форматированию.
Однако, автоматическое форматирование не всегда то, что нужно, поскольку может показаться чересчур сложным для восприятия, либо же недостаточно информативным. Именно поэтому функции strftime() и strptime() модуля time позволяют создавать свои уникальные типы форматирования.
strftime() принимает строку с некоторым набором правил для форматирования и объект struct_time (или соответствующий кортеж) в качестве аргументов и возвращает строку с датой в зависимости от использованного формата:
При этом строка time_string должна полностью соответствовать формату %d %B, %Y, в противном случае возникнет исключение ValueError!
Модуль calendar
Для использования: import calendar
По умолчанию модуль calendar следует григорианскому календарю, где понедельник является первым днём недели (номер 0), а воскресенье – последним (номер 6). В отличии от предыдущих модулей date и time, которые также предоставляют функции, связанные с календарём, модуль calendar предоставляет основные функции, связанные с отображением и манипулированием календарями.
Атрибуты calendar
Атрибут calendar.day_name возвращает итерируемый объект, содержащий названия дней недели на английском языке:
Атрибут month_name соответствует обычному соглашению, что январь – это месяц номер 1, поэтому список имеет длину в 13 элементов, первый из которых – пустая строка
Атрибут calendar.month_abbr возвращает итерируемый объект, содержащий сокращенные названия месяцев года:
Объекты, доступные по атрибутам day_name, day_abbr, month_name и month_abbr, поддерживают индексацию
Для получения номеров дней недели можно использовать атрибуты: MONDAY, TUESDAY, ..., SUNDAY. К примеру, print(calendar.MONDAY) выведет 0.
Функции calendar
Функция setfirstweekday() устанавливает заданный день недели в качестве начала недели. Например, чтобы установить первый будний день воскресенье, мы используем код:
Функция weekday(year, month, day) возвращает день недели в виде целого числа (где 0 – понедельник, 6 – воскресенье) для заданной даты. Аргументы функции year – год начиная с 1970, month – месяц в диапазоне 1-12, day – число в диапазоне 1-31:
Функция monthrange(year, month) возвращает день недели первого дня месяца и количество дней в месяце в виде кортежа для указанного года year и месяца month
1
2
3
4
importcalendarprint(calendar.monthrange(2022,1))# январь 2022 годаprint(calendar.monthrange(2021,9))# сентябрь 2021 года
1
2
3
# Вывод:
(5, 31)
(2, 30)
Функция monthcalendar(year, month) возвращает матрицу, представляющую календарь на месяц. Каждая строка матрицы представляет неделю:
Дни, которые не входят в указанный месяц, представлены нулями. При этом каждая неделя начинается с понедельника, если не установлено другое функцией setfirstweekday()
Функция month(year, month, w=0, l=0) возвращает календарь на месяц в многострочной строке. Аргументами функции являются: year (год), month (месяц), w (ширина столбца даты) и l (количество строк, отводимые на неделю).
Инфо
Аргументы w и l имеют значения по умолчанию, поэтому их можно не передавать явно при вызове функции
# Вывод:
September 2021
Mo Tu We Th Fr Sa Su
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
October 2021
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
September 2021
Mon Tue Wed Thu Fri Sat Sun
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
September 2021
Mo Tu We Th Fr Sa Su
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
September 2021
Mon Tue Wed Thu Fri Sat Sun
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Функция calendar(year, w=2, l=1, c=6, m=3) возвращает календарь на весь год в виде многострочной строки. Аргументами функции являются: year (год), w (ширина столбца даты), l (количество строк, отводимые на неделю), c (количество пробелов между столбцом месяца) и m (количество столбцов).
Инфо
Аргументы w, l, c, m имеют значения по умолчанию, поэтому их можно не передавать явно при вызове функции