Найти тему
programmer's notes (python and more)

Программирование на языке Python. Библиотека time, работа с временными интервалами

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Использование модуля time в программах на языке Python

Модулем time мы уже пользовались, сегодня остановимся на его возможностях подробнее. Только не путайте его с модулем datetime.time. Это разные сущности. Отметим термин НАЧАЛО ЭПОХИ. Этот термин используется в Unix-системах и обозначает дату 1 января 1970 года.

Обзор модуля time

  • time.asctime() — преобразует данные от time.gmtime() или time.localtime() в строку, представляющую дату и время.

Например
#!/usr/bin/python3
import time
print(time.asctime())

Результат выполнения

Sat Dec 16 10:48:40 2023

Возможет также вариант

print(time.asctime(time.localtime()))

  • time.ctime([sec]) — преобразует секунды в дату - время от начала эпохи

Например
#!/usr/bin/python3
import time
print(time.ctime(1))
print(time.ctime())

Результат выполнения

Thu Jan 1 05:00:01 1970
Sat Dec 16 10:55:20 2023

  • time.get_clock_info(name) — выдаёт информацию о разных часах. Значения name: 'monotonic' - time.monotonic(), 'perf_counter' - time.perf_counter(), 'process_time' - time.process_time(), 'thread_time' - time.thread_time(), 'time' - time.time().

Например

#!/usr/bin/python3
import time
print(time.get_clock_info('perf_counter'))

Результат

namespace(implementation='clock_gettime(CLOCK_MONOTONIC)', monotonic=True, adjustable=False, resolution=1e-09)

Где
implementation - имя базовой функции языка C, monotonic - зависят (False) или нет часы от корректировки системного времени, adjustable - могут (True) ли часы быть изменены автоматически, resolution - разрешение часов в долях секунды (тип float).

  • time.gmtime([secs]) — преобразовать секунды с начала эпохи в структуру даты и времени.

Например

#!/usr/bin/python3
import time
print(time.gmtime(10))

Результат выполнения

time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=10, tm_wday=3, tm_yday=1, tm_isdst=0)

  • time.localtime([secs]) — получить время с начала эпохи с учётом времени операционной системы.

Например

#!/usr/bin/python3
import time
print(time.localtime(10))

Результат

time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=5, tm_min=0, tm_sec=10, tm_wday=3, tm_yday=1, tm_isdst=0)

  • time.mktime(t) — преобразуется дату время в секунды от начала эпохи.

Например

#!/usr/bin/python3
import time
tm = (1971, 1, 1, 0, 0, 10, 3, 1, 0)
print(time.mktime(tm))

Результат выполнения

31518010.0

  • time.monotonic() — возвращает значение в долях секунд (float), и не зависит от корректировки системного времени. Также возможна функция time.monotonic_ns() возвращает время в наносекундах. Ниже будет представлен пример измерения времени выполнения программы с помощью возможностей модуля time.
  • time.perf_counter() — счетчик времени в долях секунд, используемых для измерения времени выполнения фрагментов программ. Также возможна функция time.perf_counter_ns(), которая возвращает наносекунды. В смысл в разнице значений счетчика, начало его не определено. Учитывается время сна приложения. Ниже будет представлен пример использования счётчика.
  • time.process_time() — возвращает время время в долях секунд, не учитывает время сна. Также возможна функция time.process_time_ns(), которая возвращает значение в наносекундах. Ниже будет представлен пример использования функции для измерения времени выполнения фрагмента программы.
  • time.sleep(sec) — приостанавливает выполнения программы на указанное количество секунд. Значение может быть вещественным.
  • time.strftime(format[, t]) — получение строки с датой и временем. Элементы формата см. здесь.

Например

#!/usr/bin/python3
import time
print(time.strftime("%a, %d-%b-%Y %H:%M:%S", time.localtime()))

Результат выполнения

Sat, 16-Dec-2023 13:24:40

  • time.strptime(string[, format]) — преобразует строку с датой в структуру времени.

Например

#!/usr/bin/python3
import time
tp = '25-01-2023 12:10:30'
tm = time.strptime(tp, '%d-%m-%Y %H:%M:%S')
print(tm)

Результат выполнения

time.struct_time(tm_year=2023, tm_mon=1, tm_mday=25, tm_hour=12, tm_min=10, tm_sec=30, tm_wday=2, tm_yday=25, tm_isdst=-1)

  • time.time() — получить время в секундах (float). Также возможна функция time.time_ns(), которая возвращает время в наносекундах. Время обычно (хотя и не всегда) отсчитывается от начала эпохи (1 января 1970 года).

Например

#!/usr/bin/python3
import time
print(time.time())

Результат выполнения

1702716380.065011

Измерение времени выполнения фрагментов программы с помощью модуля time

Важный вопрос: измерение времени выполнения программы или фрагмента программы. Модуль time не плохо подходит для этого.

Рассмотрим программу

#!/usr/bin/python3
import time, math
n = 100000
t1 = time.monotonic_ns()
[math.sin(i) for i in range(0, n)]
t2 = time.monotonic_ns()
print((t2 - t1) / n)

Программа вычисляет среднее время работы функции math.sin(i). Следует отметить, что не смотря на то, что берём среднее для довольно большой выборки вычислений, разброс в наносекундах довольно сильный. На моём компьютере от 124 наносекунд до 160 наносекунд. Ну здесь нет ничего удивительного. Многозадачная системы параллельно выполняет и другие задачи. Но с другой стороны определённую оценку времени выполнения функции мы получили.

Рекомендую попробовать проверить аналогичным образом также методы time.perf_counter_ns(), time.process_time_ns(), time.time_ns(). Кстати метод time.perf_counter_ns() даёт меньший разброс. Впрочем проверьте.

Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Ваше время истекло, сударь.
Ваше время истекло, сударь.