time.clock() несколько раз в Python?
Используя Python 2.7.5 на Windows 7, у меня есть проблема.
Я пишу программу, которая должна вычислять время, необходимое для вычисления нескольких математических алгоритмов.
Я использую start=time.clock()
и elapsed=time.clock()-start
. Это работает, но когда я пытаюсь сделать start=time.clock()
во второй раз, это не работает. Я получил это сообщение:
start=time.time()
AttributeError: 'float' object has no attribute 'time'
Я, очевидно, не могу использовать time.clock()
несколько раз, но что я могу использовать вместо этого?
Поделиться Источник Katja 16 октября 2013 в 12:27
4 ответа
- Не удается получить значение из второго вызова time.clock() в Python
Я пытаюсь вычислить время, затраченное между двумя вызовами функций.
- Смущен поведением time.clock в Python
Таким образом, я могу использовать time.clock() для измерения времени выполнения вызова функции: >>> def f() : a = time.clock() range(pow(10,8)) b = time.clock() print a,b >>> f() 0.143698 8.345905 Но теперь, если просто позвонить time.clock() несколько раз из интерактивного…
3
Похоже, что ваш код где-то имеет time = <some calculated value>
, заменяющее имя «time» от указания на правильный модуль к объекту float.
Поделиться Nico 16 октября 2013 в 12:30
2
Вы не должны использовать time. clock()
:
На Unix верните текущее процессорное время в виде числа с плавающей запятой выражается в секундах. Точность, а фактически и само определение значения “процессорного времени”, зависит от точности функции C с тем же именем, но в любом случае именно эту функцию следует использовать для бенчмаркинга Python или алгоритмов синхронизации.
На Windows эта функция возвращает секунды настенных часов, прошедшие с момента первого вызова этой функции, в виде числа с плавающей запятой, основанного на Функция Win32 QueryPerformanceCounter(). Разрешение обычно лучше, чем одна микросекунда.
Вместо этого используйте time.time()
:
Возвращает время в секундах с момента начала эпохи в виде числа с плавающей запятой. Обратите внимание, что хотя время всегда возвращается в виде числа с плавающей запятой, не все системы обеспечивают время с большей точностью, чем 1 секунда. Хотя эта функция обычно возвращает неубывающие значения, она может возвращать более низкое значение, чем предыдущий вызов, если системные часы были установлены обратно между двумя вызовами.
Проще говоря, разница заключается в следующем: при первом вызове time.clock()
запускается таймер, а при каждом последующем вызове time.clock()
-время, прошедшее с момента первого вызова. В то время как использование
всегда даст вам время с начала эпохи.
Чтобы уточнить, time.clock()
— это относительный метод измерения времени, относительно того, когда вы впервые начинаете отсчет времени с помощью метода time.clock()
, тогда как при использовании time.time()
вы каждый раз получаете секунды с момента начала эпохи.
В обоих методах вы можете довольно легко вывести разницу между ними, но использование time.clock()
может иметь непредвиденные последствия, когда требуются более сложные измерения времени, такие как несколько потоков или различные функции, которые должны взаимодействовать друг с другом — если все они синхронизируют себя относительно самих себя, трудно поддерживать вещи постоянными.
Поделиться Inbar Rose 16 октября 2013 в 12:32
1
У меня была та же ошибка.
Я обнаружил, что назвал переменную ‘time’ тем же именем , что и модуль времени.
Так он отвечает вам, что ваша переменная имеет атрибут времени, потому что ваша переменная перезаписывается вашего модуля.
Проверьте свои имена переменных или измените имя модуля !
- Диапазон time.clock() в Python
Я использую Python 2.7.6 для измерения времени работы алгоритма: starting_time = time.clock() # run algorithm finishing_time = time.clock() running_time = (finishing_time — starting_time) Я запускаю алгоритм с разными размерами входных данных. Алгоритм o (n-квадрат), и я получаю следующие. ..
- путаница в измерении времени выполнения с time.clock()!
описание time.clock() : На Windows эта функция возвращает настенные часы секунд, прошедших с момента первого вызова этой функции, в виде числа с плавающей запятой, основанного на функции Win32 QueryPerformanceCounter(). Разрешение обычно лучше, чем одна микросекунда. Я обнаружил, что другие писали…
0
Вы могли бы получить
start1 = time.clock()
Calculation
print "Runtime: " + str(time.clock() - start1)
start2 = time.clock()
Calculation
print "Runtime: " + str(time.clock() - start2)
Поделиться user2003965 16 октября 2013 в 12:35
Похожие вопросы:
time.clock() Python «против» time.time() точность?
Что лучше использовать для хронометража в Python? time. clock() или time.time()? Какой из них обеспечивает большую точность? например: start = time.clock() … do something elapsed = (time.clock() -…
Python time.clock()-сброс тактового значения с потоками
Я вижу time.clock() на Windows ‘starts’ таймер при первом вызове и возвращает эластичное время с момента первого вызова для вызовов после этого. Я читал, что единственный способ перезапустить часы -…
Я пытаюсь рассчитать время выполнения внешнего процесса, который я вызываю из python. Я хотел засечь время и увидел здесь , что time.clock() — это правильный путь. Однако я видел очень…
Не удается получить значение из второго вызова time.clock() в Python
Я пытаюсь вычислить время, затраченное между двумя вызовами функций. import time class timer(): def __init__(self) self.start_time = 0 self.stop_time = 0 def start_stream(self): self. start_time =…
Смущен поведением time.clock в Python
Таким образом, я могу использовать time.clock() для измерения времени выполнения вызова функции: >>> def f() : a = time.clock() range(pow(10,8)) b = time.clock() print a,b >>> f()…
Диапазон time.clock() в Python
Я использую Python 2.7.6 для измерения времени работы алгоритма: starting_time = time.clock() # run algorithm finishing_time = time.clock() running_time = (finishing_time — starting_time) Я запускаю…
путаница в измерении времени выполнения с time.clock()!
описание time.clock() : На Windows эта функция возвращает настенные часы секунд, прошедших с момента первого вызова этой функции, в виде числа с плавающей запятой, основанного на функции Win32…
Python: существенная разница между неделей time.time() и time.clock()?
Я пытаюсь проверить, сколько времени занимает блок кода обработки запроса http внутри моего контроллера flask, вот пример кода, который я использовал: cancelled = [] t0 = time. time() t1 =…
Сброс time.clock() в Python
start = time.clock() while True: elapsed = (time.clock() — start) if elapsed > 10: print(MOTION) elapsed = 0 Я запускаю таймер, вычисляю прошедшее время, и если прошло 10 секунд, я показываю…
python Time.clock слишком короткий результат
python Time.clock слишком короткий результат
Я использую этот код для проверки функции time.clock() в python
start = time.clock()
print(start)
time.sleep(3)
end = time.clock()
print(end)
print(end-start)
и вот результат
0.282109
0.282151
4.199999999998649e-05
док говорит: «On Unix, верните текущее процессорное время в виде числа с плавающей запятой, выраженного в секундах». но если поток спит в течение 3 секунд, то почему результат end-start так низок?
pythonПоделиться Источник AFS 28 апреля 2018 в 11:39
2 ответа
- Python time.clock() результат не точен и далек
У меня есть следующий скрипт, с помощью которого я измеряю реальное прошедшее время для нескольких функций сна. Я использую либо time.sleep(), чтобы приостановить программу, либо psychopy.core.wait(), который, как говорят, более точен, и использую таймер высокого разрешения. Я тестирую последнее…
- Почему time.clock() возвращает неправильный результат?
Почему time.clock() дает неправильный результат? Код выглядит следующим образом: time_start1 = time.time() time.sleep(5) bb = time.time() — time_start1; print bb; time_1 = time.clock() time.sleep(5) cc = time.clock() — time_1 print cc Результаты таковы: 5. 00506210327 0.006593 Второй должен быть…
5
Процессорное время означает то, что обычно называют CPU временем, то есть сколько работы процессор выполнил от имени текущего процесса. Это почти ничего, если вы спали всего 3 секунды.
Вместо этого используйте time.time()
.
Поделиться Arndt Jonasson 28 апреля 2018 в 11:59
2
Как @decece цитируется из руководства, perf_counter() будет лучшим выбором здесь.
import time
start = time.perf_counter()
time.sleep(3)
end = time.perf_counter()
print(end-start) # 3.003116666999631
Если вы хотите протестировать arbritary-код, то timeit-модуль -хороший выбор:
import timeit
n = 4
print( timeit.timeit( "time.sleep(3)", setup="import time", number=n)/n)
Выход:
3. 00312000513
Вы можете дать ему код setup=
, который выполняется один раз, и позволить ему выполнить ваш исходный код number
раза, получив общее время для всех выполнений с другими настройками по умолчанию.
Это усреднит тайминги, если вы снова разделите их на число , что сделает полученное время более надежным.
API: раз все
Ваши конкретные измерения для метода сна будут варьироваться, так как он в основном гарантирует ожидание «at least» заданного количества секунд, в зависимости от OS-перепланирования и прерываний это может занять больше времени:
Кроме того, время приостановки может быть больше, чем требуется на произвольную величину из-за планирования других действий в системе.
Изменено в версии 3.5: функция теперь спит не менее секунды, даже если сон прерывается сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. обоснование PEP 475).
Поделиться Patrick Artner 28 апреля 2018 в 11:55
Похожие вопросы:
time. clock() Python «против» time.time() точность?
Что лучше использовать для хронометража в Python? time.clock() или time.time()? Какой из них обеспечивает большую точность? например: start = time.clock() … do something elapsed = (time.clock() -…
time.clock() несколько раз в Python?
Используя Python 2.7.5 на Windows 7, у меня есть проблема. Я пишу программу, которая должна вычислять время, необходимое для вычисления нескольких математических алгоритмов. Я использую…
Python time.clock() против time.time() для синхронизации порожденного процесса
Я пытаюсь рассчитать время выполнения внешнего процесса, который я вызываю из python. Я хотел засечь время и увидел здесь , что time.clock() — это правильный путь. Однако я видел очень…
Python time.clock() результат не точен и далек
У меня есть следующий скрипт, с помощью которого я измеряю реальное прошедшее время для нескольких функций сна. Я использую либо time. sleep(), чтобы приостановить программу, либо…
Почему time.clock() возвращает неправильный результат?
Почему time.clock() дает неправильный результат? Код выглядит следующим образом: time_start1 = time.time() time.sleep(5) bb = time.time() — time_start1; print bb; time_1 = time.clock() time.sleep(5)…
time.clock(), нечетный результат при использовании внутри определения функции
Используя следующий код (Python 3.3.x, WinXp): ## debug function in a general/personal debug include file. def timer_compare(time1, time2=», note=’@’, time3=time.clock()): print(‘time1’,time1)…
Диапазон time.clock() в Python
Я использую Python 2.7.6 для измерения времени работы алгоритма: starting_time = time.clock() # run algorithm finishing_time = time.clock() running_time = (finishing_time — starting_time) Я запускаю…
путаница в измерении времени выполнения с time.clock()!
описание time. clock() : На Windows эта функция возвращает настенные часы секунд, прошедших с момента первого вызова этой функции, в виде числа с плавающей запятой, основанного на функции Win32…
Python: существенная разница между неделей time.time() и time.clock()?
Я пытаюсь проверить, сколько времени занимает блок кода обработки запроса http внутри моего контроллера flask, вот пример кода, который я использовал: cancelled = [] t0 = time.time() t1 =…
Python return время исполнения time.clock()
У меня есть следующий код, где я хочу измерить производительность времени. import time def fibonacci(n): t0 = time.clock() if n == 0: return 0 elif n == 1: return 1 else: a = fibonacci(n-1) b =…
python — Функция pygame.time.Clock () не работает в Ubuntu18.04
Я использую Ubuntu18.04. Я установил модуль pygame для воспроизведения песен. Но функция time.Clock () не работает. Это показывает следующую ошибку после запуска программы: AttributeError: у объекта ‘function’ нет атрибута ‘Clock’
Вот код:
def playSong(filename):
mixer. init()
mixer.music.load('/home/mjiabir/Music/rangamati songs/Roar.mp3')
mixer.music.play()
while mixer.music.get_busy:
time.Clock.tick(10)
mixer.music.stop()
Похоже, Linux не поддерживает этот модуль. Что мне теперь делать?
0
Jawad Un Islam Abir 26 Июн 2020 в 21:33
2 ответа
Я думаю, что вы хотите использовать pygame.time.Clock().tick(10)
.
Один из способов поиска модулей пакета или подпакета — использовать dir()
. Например:
# in a python interactive shell
import time
dir(time)
# output => ['CLOCK_BOOTTIME', 'CLOCK_MONOTONIC', 'CLOCK_MONOTONIC_RAW', 'CLOCK_PROCESS_CPUTIME_ID', 'CLOCK_REALTIME', 'CLOCK_THREAD_CPUTIME_ID', '_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'clock', 'clock_getres', 'clock_gettime', 'clock_gettime_ns', 'clock_settime', 'clock_settime_ns', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'monotonic_ns', 'perf_counter', 'perf_counter_ns', 'process_time', 'process_time_ns', 'pthread_getcpuclockid', 'sleep', 'strftime', 'strptime', 'struct_time', 'thread_time', 'thread_time_ns', 'time', 'time_ns', 'timezone', 'tzname', 'tzset']
import pygame
dir(pygame. time)
# output => ['Clock', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'delay', 'get_ticks', 'set_timer', 'wait']
0
Fadi 26 Июн 2020 в 18:43
Хотя вы можете использовать pygame.time.Clock().tick()
, я бы предложил создать объект Clock
через clock = pygame.time.Clock()
и clock.tick()
. Как правило, хорошей практикой является использование объектно-ориентированной природы Python, а не непосредственного вызова методов конструирования.
0
bbnumber2 26 Июн 2020 в 18:48
62600892Python | time.clock () метод — GeeksforGeeks
Python | time. clock () метод
Модуль времени в Python предоставляет различные функции, связанные со временем.
time.clock ()
Метод модуля времени в Python используется для получения текущего времени процессора в виде числа с плавающей запятой, выраженного в секундах.
As, Большинство функций, определенных в модуле времени, вызывают соответствующую функцию библиотеки C. time.clock ()
метод также вызывает функцию библиотеки C с тем же именем, чтобы получить результат. Точность возвращаемого значения с плавающей запятой зависит от вызываемой библиотечной функции C.
Примечание: Этот метод устарел, начиная с версии Python 3.3, и будет удален в версии Python 3.8. Поведение этого метода зависит от платформы.
Синтаксис: time.clock ()
Параметр: Параметр не требуется.
Тип возврата: Этот метод возвращает значение с плавающей запятой, которое представляет текущее время процессора в секундах.
Код # 1: Использование метода time.clock ()
для получения текущего времени процессора
|
Текущее время процессора (в секундах): 0,042379
Код # 2: Использование метода time.clock ()
для получения текущего времени процессора
|
В начале расчета Время процессора (в секундах): 0.03451 Факториал 0: 1 Факториал 1: 1 Факториал 2: 2 Факториал 3: 6 Факториал из 4: 24 Факториал 5: 120 Факториал 6: 720 Факториал 7: 5040 Факториал 8: 40320 Факториал 9: 362880 В конце расчета Время процессора (в секундах): 0,034715 Время, затраченное на расчет: 0,0002050000000000038
Ссылка: https://docs.python.org/3/library/time.html # time.clock
Внимание компьютерщик! Укрепите свои основы с помощью курса Python Programming Foundation и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS .
Расчет времени программы Python с использованием time.clock () vs. time.time ()
На этот вопрос уже есть ответы :
Закрыт 4 года назад.
Я новичок в программировании на Python. Я начал работать над Project Euler сегодня утром и хотел узнать, сколько времени потребуется на выполнение моего решения. Я искал в Интернете решение для своего
время импорта
класс Решение (объект):
def fibonacci (self, limit):
сумма = 0
ток = 1
следующий = 2
пока (текущий <= предел):
если текущий% 2 == 0:
сумма + = текущий
текущий, следующий = следующий, текущий + следующий
return str (сумма)
если __name__ == "__main__":
начало = время. Часы()
решение = Решение (). fibonacci (4000000)
elapsed = time.clock () - начало
print ("Решение:% s"% (решение))
print ("Время:% s секунд"% (прошло))
Выход:
Решение: 4613732
Время: 2.006085436846098e-05 секунд
время импорта
класс Решение (объект):
def fibonacci (self, limit):
сумма = 0
ток = 1
следующий = 2
пока (текущий <= предел):
если текущий% 2 == 0:
сумма + = текущий
текущий, следующий = следующий, текущий + следующий
return str (сумма)
если __name__ == "__main__":
начало = время.время()
решение = Решение (). fibonacci (4000000)
elapsed = time.time () - начало
print ("Решение:% s"% (решение))
print ("Время:% s секунд"% (прошло))
Вывод:
Решение: 4613732
Время: 0,0 секунды
Мой вопрос
- Правильно ли рассчитано время?
- В чем разница между time. time () и time.clock (). Если я использую time.time (), я получаю 0.0 как время.
Измерение времени в Python - время.время () против time.clock ()
Опубликовано: воскресенье, 27, -е, , января 2013 г.
Последнее обновление: 3 пятница rd май 2013
Прежде чем мы углубимся в различие в измерении времени в Python, необходимо понять различные типы времени в мире вычислений. Первый тип времени называется ЦП или временем выполнения, который измеряет, сколько времени ЦП потратил на выполнение программы. Второй тип времени называется временем настенных часов, который измеряет общее время выполнения программы на компьютере.Время настенных часов также называют прошедшим или текущим временем. По сравнению с временем ЦП время настенных часов часто больше, потому что ЦП, выполняющий измеряемую программу, может одновременно выполнять инструкции другой программы.
Еще одним важным понятием является так называемое системное время, которое измеряется системными часами. Системное время представляет собой представление компьютерной системы о течении времени. Следует помнить, что системные часы могут быть изменены операционной системой, таким образом изменяя системное время.
Модуль Python time
предоставляет различные функции, связанные со временем. Поскольку в большинстве случаев функции вызывают платформенно-зависимые функции библиотеки C с одинаковыми именами, семантика этих функций зависит от платформы.
Две полезные функции для измерения времени: time.time
и time.clock
. time.time
возвращает время в секундах с начала эпохи, то есть точку, в которой время начинается. Для любой операционной системы вы всегда можете запустить время.gmtime (0), чтобы узнать, какая эпоха в данной системе. Для Unix эпохой является 1 января 1970 года. Для Windows эпохой является 1 января 1601 года. time.time
часто используется для тестирования производительности программы в Windows. В то время как time.time
ведет себя одинаково в Unix и Windows, time.clock
имеет разное значение. В Unix time.clock
возвращает текущее время процессора, выраженное в секундах, то есть время ЦП, необходимое для выполнения текущего потока на данный момент. В Windows он возвращает время настенных часов, выраженное в секундах, прошедшее с момента первого вызова этой функции, на основе функции Win32 QueryPerformanceCounter
.Еще одно различие между time.time
и time.clock
заключается в том, что time.time
может возвращать меньшее значение, чем предыдущий вызов, если системные часы были переведены назад между двумя вызовами, а time.clock
всегда вернуть неубывающие значения.
Вот пример запуска time.time
и time.clock
на машине Unix:
# В ОС на базе Unix
>>> import time >>> print (time. time (), time.clock ()) 135 >>> time.sleep (1) >>> print (time.time (), time.clock ()) 135 |
time.time ()
показывает, что время настенных часов прошло примерно одну секунду, а time.clock ()
показывает, что время ЦП, затраченное на текущий процесс, меньше 1 микросекунды. time.clock ()
имеет гораздо более высокую точность, чем time.время ()
.
Запуск той же программы под Windows дает совершенно разные результаты:
В Windows
>>> import time >>> print (time.time (), time.clock ()) 13563.02 4.95873078841e-06 >>> time.sleep (1) >>> print (time.time (), time.clock ()) 13564.04 1.01088769662 |
Как time.time ()
, так и time. clock ()
показывают, что время настенных часов прошло приблизительно одну секунду. В отличие от Unix, time.clock ()
не возвращает время процессора, вместо этого он возвращает время настенных часов с более высокой точностью, чем time.time ()
.
Учитывая зависящее от платформы поведение time.time ()
и time.clock ()
, какой из них мы должны использовать для измерения «точной» производительности программы? Смотря как.Если ожидается, что программа будет работать в системе, которая почти выделяет больше чем достаточно ресурсов для программы, то есть на выделенном веб-сервере, на котором запущено веб-приложение на основе Python, тогда измерение программы с помощью time.clock ()
имеет смысл, поскольку веб-приложение, вероятно, будет основной программой, работающей на сервере. Если предполагается, что программа будет работать в системе, которая одновременно запускает множество других программ, то измерение программы с использованием time. 2, range (1000)) '
10000 циклов, лучшее из 3: 145 мксек на цикл
# в Windows
C: \ Python27> питон.2, диапазон (1000)) " 10000 циклов, лучшее из 3: 109 мксек на цикл |
в режиме ожидания
>>> import timeit >>> total_time = timeit.timeit ('[v for v in range (10000)]', number = 10000) >>> print (total_time) 3.60528302192688 # total wall -clock время выполнения оператора 10000 раз >>> print (total_time / 10000) 0.00036052830219268796 # среднее время на цикл >>> total_time = timeit.timeit ('[v for v in range (10000)]', number = 10000) >>> print (total_time) 3.786295175552368 # total wall- время блокировки для выполнения инструкции 10000 раз >>> print (total_time / 10000) 0.0003786295175552368 # среднее время на цикл |
Какой таймер использует timeit
? Согласно исходному коду timeit
, он использует лучший из доступных таймер:
import sys if sys. platform == 'win32': # В Windows лучший таймер - time.clock default_timer = time.clock else: # На большинстве других платформ лучший таймер - time.time default_timer = time .time |
Другой важный механизм timeit
заключается в том, что он отключает сборщик мусора во время выполнения, как показано в следующем коде:
импорт gc gcold = gc.isenabled () gc.disable () try: time = self.inner (it, self.timer) finally: if gcold: gc.enable () |
Если необходимо включить сборку мусора для более точного измерения производительности программы, т. Е. Когда программа выделяет и освобождает много объектов, тогда вы должны включить ее во время установки:
>>> timeit.timeit ("[v для v в диапазоне (10000)]", setup = "gc. enable ()", number = 10000) 3.6051759719848633 |
За исключением очень особых случаев, вы всегда должны использовать модуль timeit
для тестирования программы. Кроме того, важно помнить, что измерение производительности программы всегда зависит от контекста, поскольку ни одна программа не выполняется в системе с безграничными вычислительными ресурсами, а среднее время, измеренное по количеству циклов, всегда лучше, чем одно время, измеренное в одна казнь.
Руководство для начинающих по модулю времени Python - Real Python
Смотреть сейчас В этом руководстве есть связанный видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Освоение встроенного модуля времени Python
Модуль Python time
предоставляет множество способов представления времени в коде, таких как объекты, числа и строки. Он также предоставляет функции, отличные от представления времени, такие как ожидание во время выполнения кода и измерение эффективности вашего кода.
Эта статья проведет вас по наиболее часто используемым функциям и объектам за время
.
К концу этой статьи вы сможете:
- Понимание основных концепций , лежащих в основе работы с датой и временем, таких как эпохи, часовые пояса и летнее время
- Представьте время в коде с использованием чисел с плавающей запятой, кортежей и
struct_time
- Преобразование между разными представлениями времени
- Приостановить выполнение потока
- Измерьте производительность кода с помощью
perf_counter ()
Вы начнете с изучения того, как использовать числа с плавающей запятой для обозначения времени.
Работа со временем Python с использованием секунд
Одним из способов управления концепцией времени Python в вашем приложении является использование числа с плавающей запятой, которое представляет количество секунд, прошедших с начала эры, то есть с определенной начальной точки.
Давайте углубимся в то, что это означает, почему это полезно и как вы можете использовать его для реализации логики, основанной на времени Python, в вашем приложении.
Эпоха
В предыдущем разделе вы узнали, что можно управлять временем Python с помощью числа с плавающей запятой, представляющего время, прошедшее с начала эры.
Мерриам-Вебстер определяет эпоху как:
- Фиксированная точка времени, от которой отсчитывается серия лет
- Система хронологической записи, отсчитываемая от заданной даты за основу
Здесь важно понять, что, имея дело с временем Python, вы учитываете период времени, определяемый отправной точкой. В вычислениях вы называете эту отправную точку эпохой .
Таким образом, эпоха - это отправная точка, относительно которой вы можете измерить течение времени.
Например, если вы определяете эпоху как полночь 1 января 1970 года по всемирному координированному времени - эпоху, определенную в Windows и большинстве систем UNIX, - тогда вы можете представить полночь 2 января 1970 года по всемирному координированному времени как 86400
секунд с начала эпохи.
Это потому, что в минуте 60 секунд, в часе 60 минут и в сутках 24 часа. 2 января 1970 г. по всемирному координированному времени всего на один день позже эпохи, поэтому вы можете применить простую математику, чтобы получить этот результат:
>>> >>> 60 * 60 * 24
86400
Также важно отметить, что вы все еще можете представить время до эпохи.Количество секунд будет просто отрицательным.
Например, полночь 31 декабря 1969 г. по всемирному координированному времени (с использованием эпохи 1 января 1970 г.) можно представить как –86400
секунд.
Хотя 1 января 1970 года по всемирному координированному времени - обычная эпоха, это не единственная эпоха, используемая в вычислениях. Фактически, разные операционные системы, файловые системы и API иногда используют разные эпохи.
Как вы видели ранее, системы UNIX определяют эпоху как 1 января 1970 года. Win32 API, с другой стороны, определяет эпоху как 1 января 1601 года.
Вы можете использовать time.gmtime ()
, чтобы определить эпоху вашей системы:
>>> время импорта
>>> time.gmtime (0)
time.struct_time (tm_year = 1970, tm_mon = 1, tm_mday = 1, tm_hour = 0, tm_min = 0, tm_sec = 0, tm_wday = 3, tm_yday = 1, tm_isdst = 0)
В ходе этой статьи вы узнаете о gmtime ()
и struct_time
. А пока просто знайте, что вы можете использовать , время
, чтобы определить эпоху с помощью этой функции.
Теперь, когда вы больше понимаете, как измерять время в секундах с помощью эпох, давайте взглянем на модуль Python time
, чтобы увидеть, какие функции он предлагает, которые помогут вам в этом.
Python Время в секундах как число с плавающей запятой
Во-первых, time.time ()
возвращает количество секунд, прошедших с эпохи. Возвращаемое значение - число с плавающей запятой для учета дробных секунд:
>>> из времени импорта времени
>>> время ()
1551143536. 9323719
Число, которое вы получаете на своей машине, может сильно отличаться, потому что точка отсчета, которая считается эпохой, может сильно отличаться.
Дополнительная литература: Python 3.7 представил time_ns ()
, который возвращает целочисленное значение, представляющее то же время, прошедшее с эпохи, но в наносекундах, а не в секундах.
Время измерения в секундах полезно по ряду причин:
- Вы можете использовать число с плавающей запятой для вычисления разницы между двумя моментами времени.
- Поплавок легко сериализуем, что означает, что он может быть сохранен для передачи данных и останется нетронутым с другой стороны.
Иногда, однако, может потребоваться увидеть текущее время в виде строки. Для этого вы можете передать количество секунд, которое вы получаете от time ()
до time.ctime ()
.
Время Python в секундах как строка, представляющая местное время
Как вы видели ранее, вы можете захотеть преобразовать время Python, представленное как количество секунд, прошедших с эпохи, в строку. Вы можете сделать это с помощью ctime ()
:
>>> из времени импорта, ctime
>>> t = время ()
>>> ctime (t)
'Пн 25 фев 19:11:59 2019'
Здесь вы записали текущее время в секундах в переменную t
, а затем передали t
в качестве аргумента функции ctime ()
, которая возвращает строковое представление того же времени.
Техническая деталь: Аргумент, представляющий секунды с начала эпохи, является необязательным в соответствии с определением ctime ()
.Если вы не передаете аргумент, то по умолчанию ctime ()
использует возвращаемое значение time ()
. Итак, вы можете упростить приведенный выше пример:
>>> из времени импорта ctime
>>> ctime ()
'Пн 25 фев 19:11:59 2019'
Строковое представление времени, также известное как отметка времени , возвращаемое функцией ctime ()
, форматируется со следующей структурой:
- День недели:
Пн
(Понедельник
) - Месяц года:
фев
(февраль
) - День месяца:
25
- Часы, минуты и секунды в 24-часовом формате:
19:11:59
- Год:
2019
В предыдущем примере отображается метка времени определенного момента, захваченная с компьютера в Южно-Центральном регионе США. Но, допустим, вы живете в Сиднее, Австралия, и выполнили ту же команду в одно и то же мгновение.
Вместо вышеприведенного вывода вы увидите следующее:
>>> >>> из времени импорта, ctime
>>> t = время ()
>>> ctime (t)
'Вт 26 фев 12:11:59 2019'
Обратите внимание, что части метки времени дня недели
, дня месяца
и часов
отличаются от первого примера.
Эти выходные данные отличаются, потому что метка времени, возвращаемая ctime ()
, зависит от вашего географического положения.
Примечание: Хотя понятие часовых поясов зависит от вашего физического местоположения, вы можете изменить его в настройках компьютера без фактического перемещения.
Представление времени, зависящее от вашего физического местоположения, называется по местному времени и использует концепцию часовых поясов .
Примечание: Поскольку местное время связано с вашим языковым стандартом, временные метки часто учитывают специфические для локали детали, такие как порядок элементов в строке и перевод аббревиатур дня и месяца. ctime ()
игнорирует эти детали.
Давайте углубимся в понятие часовых поясов, чтобы вы могли лучше понять представления времени в Python.
Общие сведения о часовых поясах
Часовой пояс - это регион мира, соответствующий стандартизированному времени. Часовые пояса определяются их смещением от всемирного координированного времени (UTC) и, возможно, включением летнего времени (которое мы рассмотрим более подробно позже в этой статье).
Интересный факт: Если вы носитель английского языка, вам может быть интересно, почему сокращение для «Универсальное координированное время» - это UTC, а не более очевидное CUT.Однако, если вы носитель французского языка, вы бы назвали его Temps Universel Coordonné, что предполагает другое сокращение: TUC.
В конечном итоге Международный союз электросвязи и Международный астрономический союз сделали компромисс с UTC как официальной аббревиатурой, так что, независимо от языка, аббревиатура будет одинаковой.
UTC и часовые пояса
UTC - это стандарт времени, по которому синхронизируются (или координируются) все мировые хронометражи.Сам по себе это не часовой пояс, а скорее непревзойденный стандарт, определяющий, что такое часовые пояса.
ВремяUTC точно измеряется с использованием астрономического времени, относящегося к вращению Земли, и атомных часов.
Часовые пояса затем определяются по их смещению от UTC. Например, в Северной и Южной Америке центральный часовой пояс (CT) отстает от UTC на пять или шесть часов и, следовательно, использует обозначение UTC-5: 00 или UTC-6: 00.
Сидней, Австралия, с другой стороны, принадлежит австралийскому восточному часовому поясу (AET), который на десять или одиннадцать часов опережает UTC (UTC + 10: 00 или UTC + 11: 00).
Эта разница (от UTC-6: 00 до UTC + 10: 00) является причиной различия, которое вы наблюдали в двух выходных данных из ctime ()
в предыдущих примерах:
- Центральное время (CT):
'Mon Feb 25 19:11:59 2019'
- Австралийское восточное время (AET):
'Tue Feb 26 12:11:59 2019'
Разница между этими временами составляет ровно шестнадцать часов, что соответствует смещениям часовых поясов, упомянутым выше.
Вам может быть интересно, почему CT может быть на пять или шесть часов позже UTC или почему AET может быть на десять или одиннадцать часов впереди.Причина этого в том, что в некоторых регионах мира, включая части этих часовых поясов, действует летнее время.
Переход на летнее время
Обычно в летние месяцы световой день больше, чем в зимние. По этой причине в некоторых районах весной и летом соблюдается летнее время (DST), чтобы лучше использовать дневное время.
В местах, где соблюдается летнее время, часы переводятся на один час вперед в начале весны (фактически с потерей часа).Затем осенью часы будут сброшены на стандартное время.
Буквы S и D обозначают стандартное и летнее время в часовом поясе:
- Центральное стандартное время (CST)
- Восточное летнее время Австралии (AEDT)
Когда вы представляете время как отметки времени по местному времени, всегда важно учитывать, применимо ли летнее время или нет.
ctime ()
учитывает летнее время. Таким образом, указанная ранее разница на выходе будет более точной:
- Central Standard Time (CST):
'Mon Feb 25 19:11:59 2019'
- Австралийское восточное летнее время (AEDT):
'Tue Feb 26 12:11:59 2019'
Работа со временем Python с использованием структур данных
Теперь, когда у вас есть четкое представление о многих фундаментальных понятиях времени, включая эпохи, часовые пояса и всемирное координированное время, давайте рассмотрим другие способы представления времени с помощью модуля Python time
.
Python Time как кортеж
Вместо использования числа для представления времени Python вы можете использовать другую примитивную структуру данных: кортеж.
Кортеж позволяет вам немного легче управлять временем, абстрагируя некоторые данные и делая их более читаемыми.
Когда вы представляете время как кортеж, каждый элемент в вашем кортеже соответствует определенному элементу времени:
- Год
- Месяц как целое число от 1 (январь) до 12 (декабрь)
- День месяца
- Час как целое число в диапазоне от 0 (12 А. М.) И 23 (11 вечера)
- Минуты
- Второй
- День недели как целое число от 0 (понедельник) до 6 (воскресенье)
- День года
- Летнее время как целое число со следующими значениями:
-
1
- летнее время. -
0
стандартное время. -
-1
неизвестно.
-
Используя методы, которые вы уже изучили, вы можете представить одно и то же время Python двумя разными способами:
>>> >>> из времени импорта, ctime
>>> t = время ()
>>> т
1551186415.360564
>>> ctime (t)
'Вт 26 фев, 07:06:55 2019'
>>> time_tuple = (2019, 2, 26, 7, 6, 55, 1, 57, 0)
В этом случае и t
, и time_tuple
представляют одно и то же время, но кортеж обеспечивает более читаемый интерфейс для работы с компонентами времени.
Техническая деталь: На самом деле, если вы посмотрите на время Python, представленное time_tuple
в секундах (что вы увидите, как это сделать позже в этой статье), вы увидите, что оно преобразуется в 1551186415. 0
, а не 1551186415.360564
.
Это потому, что кортеж не может представлять доли секунды.
Хотя кортеж обеспечивает более управляемый интерфейс для работы с временем Python, существует еще лучший объект: struct_time
.
Python Время как объект
Проблема с конструкцией кортежа заключается в том, что она по-прежнему выглядит как набор чисел, даже несмотря на то, что она организована лучше, чем одно число, основанное на секундах.
struct_time
предоставляет решение этой проблемы, используя NamedTuple
из модуля Python collections
, чтобы связать последовательность чисел кортежа с полезными идентификаторами:
>>> from time import struct_time
>>> time_tuple = (2019, 2, 26, 7, 6, 55, 1, 57, 0)
>>> time_obj = struct_time (набор_времени)
>>> time_obj
time.struct_time (tm_year = 2019, tm_mon = 2, tm_mday = 26, tm_hour = 7, tm_min = 6, tm_sec = 55, tm_wday = 1, tm_yday = 57, tm_isdst = 0)
Технические детали: Если вы переходите с другого языка, термины struct
и object
могут противоречить друг другу.
В Python нет типа данных с именем struct
. Вместо этого все является объектом.
Однако имя struct_time
получено из библиотеки времени на основе C, где типом данных на самом деле является структура struct
.
Фактически, модуль time
Python, который реализован на C, использует эту структуру struct
напрямую, включая файл заголовка times.h
.
Теперь вы можете получить доступ к определенным элементам time_obj
, используя имя атрибута, а не индекс:
>>> day_of_year = time_obj.tm_yday
>>> day_of_year
57
>>> day_of_month = time_obj.tm_mday
>>> day_of_month
26
Помимо удобочитаемости и удобства использования struct_time
, также важно знать, потому что это тип возвращаемого значения для многих функций в модуле Python time
.
Преобразование времени Python в секундах в объект
Теперь, когда вы ознакомились с тремя основными способами работы со временем Python, вы узнаете, как преобразовывать данные между разными типами данных времени.
Преобразование между типами данных времени зависит от того, указано ли время в формате UTC или по местному времени.
Всемирное координированное время (UTC)
Для определения эпохи используется UTC, а не часовой пояс. Таким образом, секунды, прошедшие с начала эпохи, не зависят от вашего географического положения.
Однако этого нельзя сказать о struct_time
. Объектное представление времени Python может учитывать или не учитывать ваш часовой пояс.
Есть два способа преобразовать число с плавающей запятой, представляющее секунды, в struct_time
:
- UTC
- Местное время
Чтобы преобразовать плавающее время Python в формат struct_time
на основе UTC, модуль Python time
предоставляет функцию с именем gmtime ()
.
В этой статье вы уже видели gmtime ()
, использовавшееся однажды:
>>> время импорта
>>> time. gmtime (0)
время.struct_time (tm_year = 1970, tm_mon = 1, tm_mday = 1, tm_hour = 0, tm_min = 0, tm_sec = 0, tm_wday = 3, tm_yday = 1, tm_isdst = 0)
Вы использовали этот вызов, чтобы узнать эпоху вашей системы. Теперь у вас есть лучшая основа для понимания того, что на самом деле здесь происходит.
gmtime ()
преобразует количество секунд, прошедших с начала эпохи, в struct_time
в формате UTC. В этом случае вы передали 0
в качестве количества секунд, что означает, что вы пытаетесь найти саму эпоху в UTC.
Примечание: Обратите внимание, что для атрибута tm_isdst
установлено значение 0
. Этот атрибут указывает, используется ли в часовом поясе летнее время. UTC никогда не подписывается на DST, поэтому этот флаг всегда будет 0
при использовании gmtime ()
.
Как вы видели ранее, struct_time
не может представлять дробные секунды, поэтому gmtime ()
игнорирует дробные секунды в аргументе:
>>> время импорта
>>> время. gmtime (1,99)
time.struct_time (tm_year = 1970, tm_mon = 1, tm_mday = 1, tm_hour = 0, tm_min = 0, tm_sec = 1, tm_wday = 3, tm_yday = 1, tm_isdst = 0)
Обратите внимание, что хотя количество прошедших секунд было очень близко к 2
, дробные секунды ,99
были просто проигнорированы, как показано как tm_sec = 1
.
Параметр secs
для gmtime ()
является необязательным, то есть вы можете вызывать gmtime ()
без аргументов. Так вы получите текущее время в формате UTC:
>>> время импорта
>>> время.gmtime ()
time.struct_time (tm_year = 2019, tm_mon = 2, tm_mday = 28, tm_hour = 12, tm_min = 57, tm_sec = 24, tm_wday = 3, tm_yday = 59, tm_isdst = 0)
Интересно, что для этой функции нет обратного значения в пределах времени
. Вместо этого вам придется искать в модуле Python calendar
функцию с именем timegm ()
:
>>> импорт календаря
>>> время импорта
>>> time.gmtime ()
time.struct_time (tm_year = 2019, tm_mon = 2, tm_mday = 28, tm_hour = 13, tm_min = 23, tm_sec = 12, tm_wday = 3, tm_yday = 59, tm_isdst = 0)
>>> календарь.timegm (time.gmtime ())
1551360204
timegm ()
принимает кортеж (или struct_time
, поскольку это подкласс кортежа) и возвращает соответствующее количество секунд с начала эпохи.
Исторический контекст: Если вас интересует, почему timegm ()
не находится в времени
, вы можете просмотреть обсуждение в Python Issue 6280.
Короче говоря, он был первоначально добавлен в календарь
, потому что времени
близко следует за библиотекой времени C (определенным в времени.h
), который не содержит функции сопоставления. Вышеупомянутая проблема предлагала идею перемещения или копирования timegm ()
в time
.
Однако с развитием библиотеки datetime
, несоответствиями в пропатченной реализации time.timegm ()
и вопросом о том, как затем обрабатывать calendar.timegm ()
, разработчики отклонили патч, обнадеживая вместо этого используйте datetime
.
Работа с UTC полезна в программировании, потому что это стандарт.Вам не нужно беспокоиться о летнем времени, часовом поясе или локали.
Тем не менее, существует множество случаев, когда вы хотите использовать местное время. Далее вы увидите, как переводить секунды в местное время, чтобы вы могли именно это.
Местное время
В вашем приложении вам может потребоваться работать с местным временем, а не с UTC. Модуль time
Python предоставляет функцию для получения местного времени из числа секунд, прошедших с эпохи, называемой localtime ()
.
Подпись localtime ()
аналогична gmtime ()
в том, что она принимает необязательный аргумент секунд
, который он использует для построения struct_time
с использованием вашего местного часового пояса:
>>> время импорта
>>> time. time ()
1551448206,86196
>>> time.localtime (1551448206.86196)
time.struct_time (tm_year = 2019, tm_mon = 3, tm_mday = 1, tm_hour = 7, tm_min = 50, tm_sec = 6, tm_wday = 4, tm_yday = 60, tm_isdst = 0)
Обратите внимание, что tm_isdst = 0
.Поскольку летнее время имеет значение для местного времени, tm_isdst
будет меняться между 0
и 1
в зависимости от того, применимо ли летнее время в данное время. Поскольку tm_isdst = 0
, с 1 марта 2019 года летнее время не применяется.
В США в 2019 году летнее время начинается 10 марта. Итак, чтобы проверить, правильно ли изменится флаг летнего времени, вам нужно добавить 9 дней в секундах к аргументу секунд
.
Чтобы вычислить это, вы берете количество секунд в дне (86 400) и умножаете это на 9 дней:
>>> >>> new_secs = 1551448206.86196 + (86400 * 9)
>>> time.localtime (new_secs)
time.struct_time (tm_year = 2019, tm_mon = 3, tm_mday = 10, tm_hour = 8, tm_min = 50, tm_sec = 6, tm_wday = 6, tm_yday = 69, tm_isdst = 1)
Теперь вы увидите, что struct_time
показывает дату 10 марта 2019 г. с tm_isdst = 1
. Также обратите внимание, что tm_hour
также перескочило вперед до 8
вместо 7
в предыдущем примере из-за перехода на летнее время.
Начиная с Python 3.3, struct_time
также включает два атрибута, которые полезны при определении часового пояса struct_time
:
-
тм_зона
-
тм_гмтофф
Сначала эти атрибуты зависели от платформы, но они были доступны на всех платформах, начиная с Python 3.6.
Первый, tm_zone
хранит местный часовой пояс:
>>> время импорта
>>> current_local = время.местное время()
>>> current_local.tm_zone
'CST'
Здесь вы можете видеть, что localtime ()
возвращает struct_time
с часовым поясом, установленным на CST
(центральное стандартное время).
Как вы видели ранее, вы также можете указать часовой пояс на основе двух частей информации, смещения UTC и DST (если применимо):
>>> >>> время импорта
>>> current_local = time. localtime ()
>>> current_local.tm_gmtoff
-21600
>>> current_local.tm_isdst
0
В этом случае вы можете видеть, что current_local
отстает от GMT на 21600
секунд, что означает среднее время по Гринвичу. GMT - часовой пояс без смещения UTC: UTC ± 00: 00.
21600
секунд, разделенные на секунды в час (3600), означает, что current_local
time равно GMT-06: 00
(или UTC-06: 00
).
Вы можете использовать смещение GMT плюс статус DST, чтобы вывести, что current_local
соответствует UTC-06: 00
по стандартному времени, что соответствует стандартному часовому поясу Central.
Как и gmtime ()
, вы можете игнорировать аргумент секунд
при вызове localtime ()
, и он вернет текущее местное время в struct_time
:
>>> время импорта
>>> time.localtime ()
time.struct_time (tm_year = 2019, tm_mon = 3, tm_mday = 1, tm_hour = 8, tm_min = 34, tm_sec = 28, tm_wday = 4, tm_yday = 60, tm_isdst = 0)
В отличие от gmtime ()
, функция, обратная localtime ()
, действительно существует в модуле Python time
. Давайте посмотрим, как это работает.
Преобразование объекта местного времени в секунды
Вы уже видели, как преобразовать объект времени UTC в секунды с помощью calendar.timegm ()
. Чтобы преобразовать местное время в секунды, используйте mktime ()
.
mktime ()
требует, чтобы вы передали параметр с именем t
, который принимает форму либо обычного кортежа из 9 элементов, либо объекта struct_time
, представляющего местное время:
>>> время импорта
>>> time_tuple = (2019, 3, 10, 8, 50, 6, 6, 69, 1)
>>> время.mktime (набор_времени)
1552225806,0
>>> time_struct = time.struct_time (набор_времени)
>>> time.mktime (time_struct)
1552225806,0
Важно помнить, что t
должен быть кортежем, представляющим местное время, а не UTC:
>>> from time import gmtime, mktime
>>> # 1
>>> current_utc = time.gmtime ()
>>> current_utc
time. struct_time (tm_year = 2019, tm_mon = 3, tm_mday = 1, tm_hour = 14, tm_min = 51, tm_sec = 19, tm_wday = 4, tm_yday = 60, tm_isdst = 0)
>>> # 2
>>> current_utc_secs = mktime (current_utc)
>>> current_utc_secs
1551473479.0
>>> # 3
>>> time.gmtime (current_utc_secs)
time.struct_time (tm_year = 2019, tm_mon = 3, tm_mday = 1, tm_hour = 20, tm_min = 51, tm_sec = 19, tm_wday = 4, tm_yday = 60, tm_isdst = 0)
Примечание: В этом примере предположим, что местное время , 1 марта 2019 года, 08:51:19 CST
.
В этом примере показано, почему важно использовать mktime ()
с местным временем, а не с UTC:
gmtime ()
без аргументов возвращаетstruct_time
с использованием UTC.current_utc
показывает1 марта 2019 г., 14:51:19 UTC
. Это верно, потому чтоCST - это UTC-06: 00
, поэтому UTC должно опережать местное время на 6 часов.mktime ()
пытается вернуть количество секунд, ожидая местного времени, но вместо этого вы передалиcurrent_utc
. Таким образом, вместо того, чтобы понимать, чтоcurrent_utc
- это время UTC, предполагается, что вы имели в виду1 марта 2019 14:51:19 CST
.gmtime ()
затем используется для преобразования этих секунд обратно в UTC, что приводит к несогласованности.Текущее время:, 1 марта 2019 г., 20:51:19 UTC
. Причина такого несоответствия заключается в том, чтоmktime ()
ожидает местного времени. Таким образом, преобразование обратно в UTC добавляет еще на 6 часов по местному времени.
Работа с часовыми поясами, как известно, сложна, поэтому важно настроить себя на успех, понимая разницу между временем в формате UTC и местным временем и функциями времени Python, которые работают с каждым из них.
Преобразование объекта времени Python в строку
Хотя работа с кортежами - это весело, иногда лучше работать со строками.
Строковое представление времени, также известное как временные метки, помогает сделать время более читаемым и может быть особенно полезно для создания интуитивно понятных пользовательских интерфейсов.
Есть две функции Python time
, которые вы используете для преобразования объекта time.struct_time
в строку:
-
asctime ()
-
strftime ()
Вы начнете с изучения asctime ()
.
asctime ()
Вы используете asctime ()
для преобразования кортежа времени или struct_time
в метку времени:
>>> время импорта
>>> время.asctime (time.gmtime ())
'Пт 1 мар 18:42:08 2019'
>>> time.asctime (time.localtime ())
'Пт 1 мар 12:42:15 2019'
И gmtime ()
, и localtime ()
возвращают экземпляров struct_time
для UTC и местного времени соответственно.
Вы можете использовать asctime ()
для преобразования struct_time
в метку времени. asctime ()
работает аналогично ctime ()
, о котором вы узнали ранее в этой статье, за исключением того, что вместо передачи числа с плавающей запятой вы передаете кортеж.Даже формат метки времени у этих двух функций одинаков.
Как и для ctime ()
, параметр для asctime ()
является необязательным. Если вы не передадите объект времени в asctime ()
, он будет использовать текущее местное время:
>>> время импорта
>>> time.asctime ()
'Пт 1 мар 12:56:07 2019'
Как и ctime ()
, он также игнорирует информацию о локали.
Один из самых больших недостатков asctime ()
- негибкость формата. strftime ()
решает эту проблему, позволяя форматировать метки времени.
strftime ()
Вы можете оказаться в ситуации, когда строковый формат из ctime ()
и asctime ()
не подходит для вашего приложения. Вместо этого вы можете захотеть отформатировать свои строки так, чтобы они были более значимыми для ваших пользователей.
Один из примеров этого - если вы хотите отображать свое время в строке, которая учитывает информацию о локали.
Для форматирования строк с учетом struct_time
или кортежа времени Python вы используете strftime ()
, что означает «строка , формат времени».
strftime ()
принимает два аргумента:
-
формат
определяет порядок и форму элементов времени в вашей строке. -
t
- необязательный временной кортеж.
Для форматирования строки используются директивы .Директивы - это последовательности символов, которые начинаются с %
и определяют конкретный элемент времени, например:
-
% d
: День месяца -
% m
: Месяц года -
% Y
: Год
Например, вы можете вывести дату в вашем местном времени, используя стандарт ISO 8601 следующим образом:
>>> >>> время импорта
>>> time. strftime ('% Y-% m-% d', time.местное время())
'2019-03-01'
Дополнительная литература: Хотя представление дат с использованием времени Python является полностью допустимым и допустимым, вам также следует рассмотреть возможность использования модуля Python datetime
, который предоставляет ярлыки и более надежную платформу для совместной работы с датой и временем.
Например, вы можете упростить вывод даты в формате ISO 8601, используя datetime
:
>>> от даты импорта и времени
>>> дата (год = 2019, месяц = 3, день = 1).изоформат ()
'2019-03-01'
Чтобы узнать больше об использовании модуля Python datetime
, ознакомьтесь с использованием Python datetime для работы с датами и временем
Как вы видели ранее, большим преимуществом использования strftime ()
по сравнению с asctime ()
является его способность отображать отметки времени, которые используют информацию, зависящую от локали.
Например, если вы хотите представить дату и время с учетом языкового стандарта, вы не можете использовать asctime ()
:
>>> from time import asctime
>>> asctime ()
'Сб 2 мар 15:21:14 2019'
>>> импортировать локаль
>>> локаль.setlocale (locale.LC_TIME, 'zh_HK') # Китайский - Гонконг
'zh_HK'
>>> asctime ()
'Сб 2 мар 15:58:49 2019'
Обратите внимание, что даже после программного изменения языкового стандарта asctime ()
по-прежнему возвращает дату и время в том же формате, что и раньше.
Технические детали: LC_TIME
- это категория локали для форматирования даты и времени. locale
аргумент 'zh_HK'
может быть другим в зависимости от вашей системы.
Однако, когда вы используете strftime ()
, вы увидите, что он учитывает локаль:
>>> from time import strftime, localtime
>>> strftime ('% c', локальное время ())
'Сб 2 мар 15:23:20 2019'
>>> импортировать локаль
>>> locale. setlocale (locale.LC_TIME, 'zh_HK') # Китайский - Гонконг
'zh_HK'
>>> strftime ('% c', локальное время ())
'六 3/2 15:58:12 2019' 2019 '
Здесь вы успешно использовали информацию о локали, потому что вы использовали strftime ()
.
Примечание: % c
- это директива для даты и времени, соответствующих региону.
Если временной кортеж не передан в параметр t
, то strftime ()
по умолчанию будет использовать результат localtime ()
. Итак, вы можете упростить приведенные выше примеры, удалив необязательный второй аргумент:
>>> from time import strftime
>>> strftime ('Текущее локальное время:% c')
'Текущее местное время: 1 марта, пт, 23:18:32 2019'
Здесь вы использовали время по умолчанию вместо того, чтобы передавать свое собственное в качестве аргумента.Также обратите внимание, что аргумент формата может состоять из текста, отличного от директив форматирования.
Модуль Python time
также включает в себя обратную операцию преобразования отметки времени обратно в объект struct_time
.
Преобразование строки времени Python в объект
Когда вы работаете со строками, относящимися к дате и времени, может быть очень полезно преобразовать метку времени в объект времени.
Чтобы преобразовать строку времени в struct_time
, вы используете strptime ()
, что означает «строка , синтаксический анализ времени»:
>>> from time import strptime
>>> strptime ('2019-03-01', '% Y-% m-% d')
время.struct_time (tm_year = 2019, tm_mon = 3, tm_mday = 1, tm_hour = 0, tm_min = 0, tm_sec = 0, tm_wday = 4, tm_yday = 60, tm_isdst = -1)
Первым аргументом функции strptime ()
должна быть отметка времени, которую вы хотите преобразовать. Второй аргумент - это формат
, в котором находится метка времени.
Параметр формата является необязательным и по умолчанию равен
'% a% b% d% H:% M:% S% Y'
. Следовательно, если у вас есть метка времени в этом формате, вам не нужно передавать ее в качестве аргумента:
>>> strptime ('Пт 01 мар 23:38:40 2019')
время.struct_time (tm_year = 2019, tm_mon = 3, tm_mday = 1, tm_hour = 23, tm_min = 38, tm_sec = 40, tm_wday = 4, tm_yday = 60, tm_isdst = -1)
Поскольку struct_time
имеет 9 ключевых компонентов даты и времени, strptime ()
должен обеспечивать разумные значения по умолчанию для значений тех компонентов, которые он не может проанализировать из строки
.
В предыдущих примерах tm_isdst = -1
. Это означает, что strptime ()
не может определить по метке времени, соответствует ли она переходу на летнее время или нет.
Теперь вы знаете, как работать со временем и датой Python, используя модуль time
различными способами. Однако есть и другие применения для time
, помимо простого создания объектов времени, получения строк времени Python и использования секунд, прошедших с эпохи.
Приостановка исполнения
Одна действительно полезная функция времени Python - это sleep ()
, которая приостанавливает выполнение потока на определенное время.
Например, вы можете приостановить выполнение вашей программы на 10 секунд следующим образом:
>>> >>> from time import sleep, strftime
>>> strftime ('% c')
'Пт 1 мар 23:49:26 2019'
>>> спать (10)
>>> strftime ('% c')
'Пт 1 мар 23:49:36 2019'
Ваша программа напечатает первую отформатированную строку datetime
, затем остановится на 10 секунд и, наконец, напечатает вторую отформатированную строку datetime
.
Вы также можете передать дробные секунды sleep ()
:
>>> из времени импорта сна
>>> сон (0,5)
sleep ()
полезен для тестирования или для того, чтобы заставить вашу программу ждать по любой причине, но вы должны быть осторожны, чтобы не остановить свой производственный код, если у вас нет веской причины для этого.
До Python 3.5 сигнал, отправленный вашему процессу, мог прервать sleep ()
. Однако в 3.5 и более поздних версиях sleep ()
всегда приостанавливает выполнение по крайней мере на указанное время, даже если процесс получает сигнал.
sleep ()
- это всего лишь одна функция времени Python, которая может помочь вам протестировать ваши программы и сделать их более надежными.
Измерение производительности
Вы можете использовать время
для измерения производительности вашей программы.
Это можно сделать с помощью perf_counter ()
, который, как следует из названия, предоставляет счетчик производительности с высоким разрешением для измерения коротких промежутков времени.
Чтобы использовать perf_counter ()
, вы устанавливаете счетчик до начала выполнения вашего кода, а также после его завершения:
>>> из времени import perf_counter
>>> def longrunning_function ():
. .. для i в диапазоне (1, 11):
... time.sleep (я / я ** 2)
...
>>> start = perf_counter ()
>>> longrunning_function ()
>>> конец = perf_counter ()
>>> execution_time = (конец - начало)
>>> Время_исполнения
8.201258441999926
Во-первых, start
фиксирует момент перед вызовом функции. конец
фиксирует момент после возврата из функции. Общее время выполнения функции составило (конец - начало)
секунд.
Технические детали: Python 3.7 представил perf_counter_ns ()
, который работает так же, как perf_counter ()
, но использует наносекунды вместо секунд.
perf_counter ()
(или perf_counter_ns ()
) - самый точный способ измерить производительность вашего кода за одно выполнение. Однако, если вы пытаетесь точно измерить производительность фрагмента кода, я рекомендую использовать модуль Python timeit
.
timeit
специализируется на многократном запуске кода для более точного анализа производительности и помогает избежать чрезмерного упрощения измерения времени, а также других распространенных ошибок.
Заключение
Поздравляем! Теперь у вас есть отличная основа для работы с датой и временем в Python.
Теперь вы можете:
- Используйте число с плавающей запятой, представляющее секунды, прошедшие с эпохи, для работы со временем
- Управление временем с помощью кортежей и
объектов struct_time
- Преобразование между секундами, кортежами и строками отметок времени
- Приостановить выполнение потока Python
- Измерьте производительность с помощью
perf_counter ()
Вдобавок ко всему, вы узнали некоторые фундаментальные концепции, связанные с датой и временем, например:
- Эпох
- UTC
- Часовые пояса
- Летнее время
А теперь пришло время применить полученные знания о времени Python в ваших реальных приложениях!
Дополнительная литература
Если вы хотите продолжить изучение использования даты и времени в Python, ознакомьтесь со следующими модулями:
-
datetime
: Более надежный модуль даты и времени в стандартной библиотеке Python -
timeit
: Модуль для измерения производительности фрагментов кода -
астропия
: Более точные даты, используемые в астрономии
Смотреть сейчас В этом руководстве есть связанный видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Освоение встроенного модуля времени Python
Как не прыгать во времени с помощью Python - Блог
Если вы хотите отображать время для пользователя вашего приложения, вы запрашиваете время дня. Однако, если вашему приложению необходимо измерить прошедшее время, вам понадобится таймер, который даст правильный ответ даже , если пользователь изменит время на системных часах .
Системные часы, которые показывают время дня, называются часами реального времени или настенными часами .Время на этих часах может перескакивать в прошлое и будущее. Накладывать настенные часы, чтобы узнать, сколько времени прошло с момента предыдущего события, - это ожидаемая ошибка.
Например, предположим, что ваше приложение выполняет операцию в ответ на событие, но оно выполняет эту операцию только один раз в час, а между ними ничего не делает. Возможно, операция - это какая-то задача по очистке. Предположим, пользователь допустил опечатку и перед запуском приложения установил системные часы на неправильный месяц; пользователь может исправить это позже, когда ваше приложение уже запущено.Предположим, что дата теперь на месяц раньше, чем когда ваше приложение было запущено, это будет целый месяц, пока ваше приложение не решит, что ему нужно снова выполнить свои операции очистки!
Чтобы безопасно измерять прошедшее время в вашем приложении, вам нужны часы, которые измеряют время непрерывно, без скачков, когда пользователь устанавливает системные часы. Эти часы называются монотонными . В Python 3.3 была введена функция time.monotonic ()
для обеспечения основных монотонных часов.До Python 3.3 существовал модуль PyPI под названием [monotonic] (https://pypi.org/project/monotonic/)
, который обеспечивает аналогичную функциональность.
время импорта
start = time. monotonic ()
time.sleep (0,2)
конец = время.монотонный ()
print ("начало: {:> 9.2f}". формат (начало))
print ("конец: {:> 9.2f}". формат (конец))
print ("диапазон: {:> 9.2f}". формат (конец - начало))
начало: 4601.77
конец: 4601.97
диапазон: 0.20
Для измерения производительности важно иметь монотонные таймеры с высокой точностью. Такой таймер Python предоставляет в time.perf_counter ()
:
время импорта
start = time.perf_counter ()
я = 0
пока я <100000:
я = я + 1
elapsed_time = time.perf_counter () - начало
print ("Прошедшее время: {}". format (elapsed_time))
Истекшее время: 0,012327131999882113
Из Python 3.8 time.clock ()
будет удалена и будет использоваться time.perf_counter ()
.
Как создать часы с помощью Python
Как создать часы с помощью Python и Tkinter.
Цифровые часыТеперь мы создадим цифровые часы с будильником, секундомером и таймером. Он использует Python 3. Он также издает звуковой сигнал, когда время истекло в будильнике и таймере. Этот звуковой сигнал генерируется «winsound.Beep ()» в Windows и «Beep» CLI в Unix. Вот его демо.
Clock DemoСначала создайте файл с именем «Clock.py ’и откройте его в своем редакторе.
Импортируйте следующие модули.
Здесь мы импортировали Tkinter, datetime, platform (для определения операционной системы для Beep), winsound (только Windows), os (только Unix).
Теперь создадим окно tkinter.
Здесь мы создали простое окно Tkinter. Мы объявили название «Часы». и установите его размер на «500X250»
Чтобы добавить элемент управления вкладками, мы можем использовать Tkinter Notebook. Здесь мы добавим четыре вкладки для часов, будильника, секундомера и таймера.
Мы использовали Frame для каждой вкладки, а затем добавили ее в блокнот.
Теперь мы создадим цифровые часы.
Добавление компонентов часов Tkinter
Теперь мы добавим компоненты tkinter для часов.
Здесь мы добавили две метки, время и дату. Оба получат данные от функциональных часов.
Создание функции часов
Теперь мы создадим функцию часов, которая управляет метками времени и даты.
В этой функции дата и время берутся из модуля datetime, а затем конвертируются в PM и AM Time.Вы должны добавить эту функцию ниже инициализации Tkinter и выше инициализации Notebook.
Теперь мы создадим сигнал тревоги, который будет издавать звуковой сигнал, когда время истечет.
Добавление компонентов сигнализации Tkinter.
Здесь мы добавили окно ввода сигнала тревоги, инструкции по тревоге, которые говорят нам установить тревогу в этом формате → ЧЧ: ММ (PM / AM). Например, 13:30 означает 13:30 часов. Затем это кнопка Set Alarm, которая вызывает функцию тревоги. И ярлык состояния будильника отображает информацию о будильнике, установлен или нет будильник, и о том, что время истекло.
Создание функции сигнализации
Здесь мы создадим функцию сигнализации, которая вызывается кнопкой set_alarm_button. Добавьте эту функцию над инициализацией ноутбука и под функцией часов.
Здесь берет модуль datetime формы времени и форматирует его. Затем он проверяет, совпадает ли введенное время или нет. Если он такой же, то он издает звуковой сигнал в соответствии с операционной системой.
Теперь сделаем секундомер по нашей программе.
Добавление компонентов секундомера Tkinter
Теперь мы добавим компоненты tkinter нашего секундомера.
Здесь есть метка секундомера, кнопки запуска, остановки и сброса, которые вызывают функцию секундомера.
Добавление функции счетчика секундомера
Теперь мы добавим функцию счетчика секундомера, которая управляет секундомером. Сначала мы добавим две строки счетчика секундомера. Добавьте их ниже инициализации Tkinter и выше функции часов.
Эти строки говорят нам о секундомере. Теперь мы добавим функцию счетчика секундомера. Добавьте его под функцией тревоги и над инициализацией ноутбука.
Это счетчик секундомера, который управляет секундомером. Каждую секунду он добавляет 1 к счетчику секундомера.
Добавление функции секундомера
Теперь мы добавим функцию секундомера, которая управляет секундомером и вызывается с помощью кнопок секундомера.
В этой функции, если работа запущена → вызывается счетчик секундомера и устанавливается секундомер, работающий на «True». Если это Стоп → Секундомер устанавливается на «Ложь». Если это Reset → Он устанавливает счетчик на 66600 или 0 и работает на «False»
Теперь мы создадим таймер, который подает звуковой сигнал, когда время истекло.Он работает по принципу секундомера, но вместо добавления 1 в счетчик вычитает из него 1.
Добавление компонентов таймера Tkinter
Теперь мы добавим компоненты таймера tkinter.
Здесь есть запись Get Timer, инструкции, которые говорят нам, что мы должны установить таймер в этом формате → HH: MM: SS Eg → 01:30:40 означает один час 30 минут 40 секунд. Затем есть кнопка «Пуск», «Стоп», «Сброс», которая вызывает функцию таймера.
Добавление функции счетчика таймера
Теперь мы добавим функцию счетчика таймера, которая управляет таймером.Сначала мы добавим две строки счетчика таймера. Добавьте эти две линии ниже секундомера и функцию часов выше.
Эти строки рассказывают нам о таймере. Теперь мы добавим функцию счетчика таймера. Добавьте его под функцией секундомера и над инициализацией ноутбука.
Это счетчик таймера, который управляет таймером. Каждую секунду он вычитает 1 из числа счетчика таймера.
Добавление функции таймера
Теперь мы добавим функцию таймера, которая управляет таймером и вызывается с помощью кнопок таймера.
В этой функции, если работа начинается → он получает текст ввода таймера и форматирует его, а затем устанавливает счетчик таймера на форматированный текст, вызывает счетчик таймера и устанавливает таймер работает на «Истина». Если это Stop → Он устанавливает таймер на «False». Если это Сброс → Он устанавливает счетчик на 66600 или 0 и работает на «Ложь»
Теперь последняя часть. Запустим часы и окно tkinter. Добавьте этот код в конце.
Это запустит окно часов и Tkinter.
Вот его полный код
Теперь вы можете запускать свой код просто из терминала, командной строки или вашей IDE / редактора.Это будет работать.
Где ваше узкое место? Время процессора против времени настенных часов
Если ваш процесс медленный, это может быть из-за того, что он очень загружает ЦП, или, может быть, он блокирует ввод-вывод (сеть или файловая система), или блокируется, или просто спит. Но как узнать?
Есть множество ответов, но в этой статье я собираюсь рассмотреть, вероятно, самую простую эвристику: сравнение времени процессора и времени настенных часов.
Я начну с демонстрации того, как измерить его на всем протяжении вашего процесса, а затем продемонстрирую, как вы можете измерить его с помощью Python с течением времени.
Время настенных часов и время процессора
Время настенных часов измеряет, сколько времени прошло, как если бы вы смотрели на часы на стене. Процессорное время - это количество секунд, в течение которых процессор был занят.
Чтобы понять производительность, вы хотите сравнить два.
Например, команда host
отправляет DNS-запрос на DNS-сервер, чтобы выяснить, какие почтовые серверы использует мой домен:
$ host -t MX pythonspeed.com
Почта pythonspeed.com обрабатывается in2-smtp.messagingengine.com.
Почта pythonspeed.com обрабатывается in1-smtp.messagingengine.com.
Где эта команда проводит время?
Мы можем выяснить это на общем уровне с помощью команды time
, которая доступна в системах Unix:
$ time host -t MX pythonspeed.com
Почта pythonspeed.com обрабатывается in1-smtp.messagingengine.com.
Почта pythonspeed.com обрабатывается in2-smtp.messagingengine.com.
реальный 0 мин. 0,069 с
пользователь 0m0.006s
sys 0m0.005s
Команда time
запускает переданные ей аргументы и записывает три строки дополнительных выходных данных:
-
real
: время настенных часов. -
пользователь
: процессорное время процесса. -
sys
: процессорное время операционной системы из-за системных вызовов процесса.
В этом случае время настенных часов было выше, чем время процессора, так что это говорит о том, что процесс провел кучу времени в ожидании (58 мс или около того), вместо того, чтобы выполнять вычисления все время. Чего он ждал? Вероятно, он ждал сетевого ответа от DNS-сервера моего интернет-провайдера.
Другими словами, узел
не является узким местом ЦП, он, вероятно, узким местом сети. Я мог бы купить компьютер с процессором, который в два раза быстрее, и это очень мало повлияло бы на время, необходимое для получения результата.
Важно: Если на вашем компьютере работает много процессов, эти другие процессы будут использовать некоторый процессор. Если они достаточно заняты, процесс, который вы тестируете, может закончиться ожиданием освобождения ЦП.
А пока просто помните, что если вы измеряете производительность, вы должны попробовать сделать это на неподвижной машине, когда больше ничего не работает.Если вы серьезно занимаетесь тестированием, вас может заинтересовать методика надежного тестирования в условиях шума и даже различных моделей процессоров.
Что можно узнать из разных соотношений
В приведенном выше примере время ЦП было ниже, чем время настенных часов, но возможны другие отношения.
Возможную взаимосвязь проще выразить как соотношение (время ЦП) / (время настенных часов)
, то есть ЦП в секунду
.
Если это однопоточный процесс:
-
ЦП в секунду ≈ 1
: Процесс все свое время проводил с использованием ЦП. Более быстрый процессор, скорее всего, заставит программу работать быстрее. -
ЦП / с <1
: Чем меньше число, тем больше времени процесс провел в ожидании (для сети, жесткого диска, блокировок или других процессов для освобождения ЦП или просто ожидания). Например. если ЦП в секунду составляет 0,75, 25% времени было потрачено на ожидание.
Если это многопоточный процесс и ваш компьютер имеет N
процессоров и не менее N
потоков, процессоров в секунду
может достигать N
.
-
ЦП / сек <1
: Процесс большую часть времени проводил в ожидании. -
ЦП в секунду ≈ N
: Процесс насыщает все ЦП. - Другие значения: В процессе использовалась некоторая комбинация ожидания и ЦП, и что является узким местом, может быть труднее определить с помощью только этого измерения. Вы можете понять это по количеству потоков - если вы выполняете 2 потока и
ЦП в секунду = 2
, значит, вы перегружены.
Использование ЦП с течением времени с библиотекой psutil Python
До сих пор мы изучали использование ЦП на протяжении всего процесса, но на самом деле можем измерить его с течением времени.
В Python простой способ сделать это - использовать библиотеку psutil
, которая позволяет получить много полезной информации о процессах.
Вы можете видеть системное время, время пользователя, а также соответствующие числа для дочерних процессов:
>>> import psutil
>>> p = psutil.Процесс (pid = 6045)
>>> p.cpu_times ()
pcputimes (пользователь = 345,45, система = 12,8, children_user = 220,03, children_system = 17,37)
Чтобы увидеть изменения во времени, мы можем написать небольшую утилиту, которая выводит ЦП в секунду
каждую секунду для произвольного процесса вместе с его дочерними элементами:
импортная система
время импорта
import psutil
process = psutil.Process (int (sys.argv [1]))
last_times = process. cpu_times ()
пока process.is_running ():
время сна (1)
раз = процесс.cpu_times ()
использование = сумма (раз) - сумма (последние_ раз)
last_times = раз
print ("{:. 2f} ЦП / сек" .format (использование))
И мы можем использовать его, чтобы увидеть, сколько процессора использует процесс с PID 6045:
$ python cpu-over-time.py 6045
0,03 ЦП / сек
0,09 ЦП / сек
0,12 ЦП / сек
0,40 ЦП / сек
0,50 ЦП / сек
0,13 ЦП / сек
Самое узкое горлышко нужно исправить
Обычно нет смысла сосредотачиваться на оптимизации обработки ЦП, если 90% времени процесса тратится на ожидание сети.Таким образом, первым шагом в оптимизации производительности всегда является определение узкого места.
И в зависимости от того, что вы создаете, довольно часто узким местом является не процессор.
.