time - clock time
timestamp - количество секунд с 1 января 1970 года (Epoch).
Так как функции этого модуля обращаются к аналогичным функциям языка С, то они платформено-зависимые.
- time() - на основе системного вызова time() - "wall clock"
- monotonic() - used to measure elapsed time in a long-running process because it is guaranteed never to move backwards, even if the system time is changed.
- perf_counter() - самое высокое разрешение для коротких измерений времени (обычно измерение производительности).
- clock() - cpu time.
- process_time() - returns the combined processor time and system time
Сравним часы
TODO: сделать сравнение в виде таблицы: |process_time | adjustable | implementation | monotonic | resolution | current | |--|--|--|--|--|--| |process_time | adjustable | implementation | monotonic | resolution | current |
clock:
adjustable : False
implementation: clock()
monotonic : True
resolution : 0.001
current : 0.25
monotonic:
adjustable : False
implementation: clock_gettime(CLOCK_MONOTONIC)
monotonic : True
resolution : 3.8e-07
current : 519313.118129497
perf_counter:
adjustable : False
implementation: clock_gettime(CLOCK_MONOTONIC)
monotonic : True
resolution : 3.8e-07
current : 519313.118386327
process_time:
adjustable : False
implementation: clock_gettime(CLOCK_PROCESS_CPUTIME_ID)
monotonic : True
resolution : 0.015625
current : 0.25
time:
adjustable : True
implementation: clock_gettime(CLOCK_REALTIME)
monotonic : False
resolution : 0.015625
current : 1524093750.628306
time.time() - wall clock time
import time
print('time() =', time.time()) # 1524116343.1965854
print('ctime() =', time.ctime()) # Thu Apr 19 08:39:03 2018
later = time.time() + 15 # 15 sec later
print('ctime(time()+15 sec) =', time.ctime(later)) # Thu Apr 19 08:39:18 2018
Так как time() обращается к system clock, и они могут изменяться, когда пользовательские или системные сервисы пытаются синхронизировать время у многих компьютеров, то вызывая последовательно time() можно получить времена как по возрастанию, так и по убыванию.
time.monotonic() - время строго по возрастанию
Чтобы гарантированно получить время по возрастанию, используйте monotonic().
Это не время с Эпохи. Это время, чтобы можно было сравнивать.
import time
start = time.monotonic()
time.sleep(0.1)
end = time.monotonic()
print('start : {:>9.2f}'.format(start))
print('end : {:>9.2f}'.format(end))
print('span : {:>9.2f}'.format(end - start))
Получим:
start : 543779.74
end : 543779.84
span : 0.10
Processor Clock Time
time() - возвращает wall clock time, clock() - processor clock time - реальное время, которое потратила программа на выполнение.
В примере считается md5 checksum.
import hashlib
import time
# Data to use to calculate md5 checksums
data = open(__file__, 'rb').read()
for i in range(5):
h = hashlib.sha1()
print(time.ctime(), ': {:0.3f} {:0.3f}'.format(
time.time(), time.clock()))
for i in range(300000):
h.update(data)
cksum = h.digest()
Получим:
Thu Apr 19 09:19:08 2018 : 1524118748.980 0.234
Thu Apr 19 09:19:10 2018 : 1524118750.501 1.687
Thu Apr 19 09:19:12 2018 : 1524118752.074 3.155
Thu Apr 19 09:19:13 2018 : 1524118753.588 4.609
Thu Apr 19 09:19:15 2018 : 1524118755.113 6.077
time() изменился на 6.132999897, clock() - на 5.843 секунд.
Обычно, если процессор ничего не делает, processor time почти не изменяется. В примере процесс спит. Время wall clock идет, а processor time небольшой.
import time
template = '{} - {:0.2f} - {:0.2f}'
print(template.format(
time.ctime(), time.time(), time.clock())
)
for i in range(3, 0, -1):
print('Sleeping', i)
time.sleep(i)
print(template.format(
time.ctime(), time.time(), time.clock())
)
получим
Thu Apr 19 09:29:30 2018 - 1524119370.68 - 0.19
Sleeping 3
Thu Apr 19 09:29:33 2018 - 1524119373.68 - 0.19
Sleeping 2
Thu Apr 19 09:29:35 2018 - 1524119375.68 - 0.19
Sleeping 1
Thu Apr 19 09:29:36 2018 - 1524119376.69 - 0.19
Вызов sleep() приостанавливает выполнение текущего thread до тех пор, пока система его не разбудет. Если в программе 1 thread, то приложение ничего не делает пока спит.
Performance Counter
Мерить производительность лучше с помощью perf_counter()
Как и в monotonic(), это не время с Эпохи, это время чтобы сравнивать.
import hashlib
import time
# Data to use to calculate md5 checksums
data = open(__file__, 'rb').read()
loop_start = time.perf_counter()
for i in range(5):
iter_start = time.perf_counter()
h = hashlib.sha1()
for i in range(300000):
h.update(data)
cksum = h.digest()
now = time.perf_counter()
loop_elapsed = now - loop_start
iter_elapsed = now - iter_start
print(time.ctime(), ': {:0.3f} {:0.3f}'.format(
iter_elapsed, loop_elapsed))
получим:
Thu Apr 19 09:57:08 2018 : 2.216 2.216
Thu Apr 19 09:57:10 2018 : 2.212 4.428
Thu Apr 19 09:57:13 2018 : 2.192 6.620
Thu Apr 19 09:57:15 2018 : 1.856 8.477
Thu Apr 19 09:57:16 2018 : 1.915 10.392
Время как структура struct_time
Когда нужно время, разбитое на составляющие части (год, месяц, день, час, день недели и тп), используйте struct_time
- gmtime() - время в UTC
- localtime() - время в локальной таймзоне компьютера
- mktime() - из времени (структуры) получить timestamp
import time
def show_struct(s):
print(' tm_year :', s.tm_year)
print(' tm_mon :', s.tm_mon)
print(' tm_mday :', s.tm_mday)
print(' tm_hour :', s.tm_hour)
print(' tm_min :', s.tm_min)
print(' tm_sec :', s.tm_sec)
print(' tm_wday :', s.tm_wday)
print(' tm_yday :', s.tm_yday)
print(' tm_isdst:', s.tm_isdst)
print('gmtime:')
show_struct(time.gmtime())
print('\nlocaltime:')
show_struct(time.localtime())
print('\nmktime:', time.mktime(time.localtime()))
получим:
gmtime:
tm_year : 2018
tm_mon : 4
tm_mday : 19
tm_hour : 7
tm_min : 4
tm_sec : 25
tm_wday : 3
tm_yday : 109
tm_isdst: 0
localtime:
tm_year : 2018
tm_mon : 4
tm_mday : 19
tm_hour : 10
tm_min : 4
tm_sec : 25
tm_wday : 3
tm_yday : 109
tm_isdst: 0
mktime: 1524121465.0
Time zone
Функции определения времени используют таймзоны заданные в программе или в таймзоне системы по умолчанию. Изменение таймзоны не изменяет реальное время, только его представление.
Для изменения таймзоны установите с помощью tzset() переменную окружения TZ. У таймзоны много специфической информации. Обычно используют имя таймзоны, чтобы библиотеки более низкого уровня получили эту информацию.
Изменим несколько раз таймзону и посмотрим на результат работы функций:
import time
import os
def show_zone_info():
print(' TZ :', os.environ.get('TZ', '(not set)'))
print(' tzname:', time.tzname)
print(' Zone : {} ({})'.format(
time.timezone, (time.timezone / 3600)))
print(' DST :', time.daylight)
print(' Time :', time.ctime())
print()
print('Default :')
show_zone_info()
ZONES = [
'GMT',
'Europe/Amsterdam',
]
for zone in ZONES:
os.environ['TZ'] = zone
time.tzset()
print(zone, ':')
show_zone_info()
получим:
Default :
TZ : Europe/Moscow
tzname: ('MSK', 'MSD')
Zone : -10800 (-3.0)
DST : 1
Time : Thu Apr 19 10:15:33 2018
GMT :
TZ : GMT
tzname: ('GMT', ' ')
Zone : 0 (0.0)
DST : 0
Time : Thu Apr 19 07:15:33 2018
Europe/Amsterdam :
TZ : Europe/Amsterdam
tzname: ('CET', 'CEST')
Zone : -3600 (-1.0)
DST : 1
Time : Thu Apr 19 09:15:33 2018
Преобразование времени в строку и разбор строки
- strftime(format, tupletime) - из структуры в строку по формату, если tupletime не задан, то берется текущее время.
- strptime(string, format) - из строки в структуру (как в gmtime или localtime)
Таблица преобразования типов:
|From \ To | timestamp | time tuple | string |
|-|-|-|-|
| timestamp |-| gmtime (UTC)
localtime (local time)|-|
| time tuple | calendar.timegm (UTC)
mktime (local time)|-| strftime |
| string |-| strptime |-|
import time
def show_struct(s):
print(' tm_year :', s.tm_year)
print(' tm_mon :', s.tm_mon)
print(' tm_mday :', s.tm_mday)
print(' tm_hour :', s.tm_hour)
print(' tm_min :', s.tm_min)
print(' tm_sec :', s.tm_sec)
print(' tm_wday :', s.tm_wday)
print(' tm_yday :', s.tm_yday)
print(' tm_isdst:', s.tm_isdst)
now = time.ctime(1483391847.433716)
print('Now:', now)
parsed = time.strptime(now)
print('\nParsed:')
show_struct(parsed)
print('\nFormatted:',
time.strftime("%a %b %d %H:%M:%S %Y", parsed))
получим
Now: Tue Jan 3 00:17:27 2017
Parsed:
tm_year : 2017
tm_mon : 1
tm_mday : 3
tm_hour : 0
tm_min : 17
tm_sec : 27
tm_wday : 1
tm_yday : 3
tm_isdst: -1
Formatted: Tue Jan 03 00:17:27 2017
Таблица форматов
Directive | Meaning |
---|---|
%a | Locale’s abbreviated weekday name. |
%A | Locale’s full weekday name. |
%b | Locale’s abbreviated month name. |
%B | Locale’s full month name. |
%c | Locale’s appropriate date and time representation. |
%d | Day of the month as a decimal number [01,31]. |
%H | Hour (24-hour clock) as a decimal number [00,23]. |
%I | Hour (12-hour clock) as a decimal number [01,12]. |
%j | Day of the year as a decimal number [001,366]. |
%m | Month as a decimal number [01,12]. |
%M | Minute as a decimal number [00,59]. |
%p | Locale’s equivalent of either AM or PM. |
%S | Second as a decimal number [00,61]. |
%U | Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0. |
%w | Weekday as a decimal number [0(Sunday),6]. |
%W | Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0. |
%x | Locale’s appropriate date representation. |
%X | Locale’s appropriate time representation. |
%y | Year without century as a decimal number [00,99]. |
%Y | Year with century as a decimal number. |
%z | Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59]. |
%Z | Time zone name (no characters if no time zone exists). |
%% | A literal '%' character. |