Доброго времени суток, читатели, зрители моего канала 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) — приостанавливает выполнения программы на указанное количество секунд. Значение может быть вещественным.
Например
#!/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.