Примеры работы strptime() в python
Содержание:
- Сравните производительность блоков кода
- Range
- Testing
- Limitations
- Работа с unix timestamp/time на python
- Метод after() — Погружение в сон для Tkinter
- Как открыть HEIC
- Работа с часовыми поясами
- Связанные темы и праздники
- Получение текущего объекта datetime
- Главные критерии выбора плиткореза
- Способы реализации параллельных вычислений в программах на Python.
- Вызов sleep() в Tkinter и wxPython
- Python Interface¶
- datetime.datetime
- Что дальше: многозадачность и оптимизация
- Модуль time
Сравните производительность блоков кода
Мы можем легко сравнить производительность нескольких блоков кода с помощью .
Мы будем использовать для этой цели таймер, используя .
Время, затрачиваемое на блок кода, будет текущим временем минус начальное время, взятое за эталон, которое вы можете передавать через переменные.
import timeit start_time = timeit.default_timer() function_1() time_1 = timeit.default_timer() - start_time start_time = timeit.default_timer() function_2() time_2 = timeit.default_timer() - start_time print('Function 1 took', time_1) print('Function 2 took', time_2)
Давайте протестируем 2 функции в массиве numpy и и посмотрим, как они сравниваются.
import timeit import numpy as np def time_range(size): for i in range(size): pass def time_arange(size): np.arange(size) if __name__ == '__main__': # For smaller arrays print('Array size: 1000') start_time = timeit.default_timer(); time_range(1000) range_time_1 = timeit.default_timer() - start_time start_time = timeit.default_timer(); time_arange(1000) arange_time_1 = timeit.default_timer() - start_time # For large arrays print('Array size: 1000000') start_time = timeit.default_timer(); time_range(1000000) range_time_2 = timeit.default_timer() - start_time start_time = timeit.default_timer(); time_arange(1000000) arange_time_2 = timeit.default_timer() - start_time print(f'size 1000: range() took {range_time_1}') print(f'size 1000: arange() took {arange_time_1}') print(f'size 1000000: range() took {range_time_2}') print(f'size 1000000: arange() took {arange_time_2}')
Выход
Array size: 1000 Array size: 1000000 size 1000: range() took 2.2970001737121493e-05 size 1000: arange() took 8.393999451072887e-06 size 1000000: range() took 0.02567379199899733 size 1000000: arange() took 0.0031752489994687494
Таким образом, мы могли легко использовать для сравнения производительности различных функций.
Range
If you want to iterate over a period, you can use the method:
Note
Supported units for are: , , ,
, , and
You can pass an amount for the passed unit to control the length of the gap:
You can also directly iterate over the instance,
the unit will be in this case:
You can check if a instance is inside a period using the keyword:
Testing
The testing methods allow you to set a instance (real or mock) to be returned
when a «now» instance is created.
The provided instance will be returned specifically under the following conditions:
- A call to the method, ex. .
- When the string «now» is passed to the method, ex.
If you don’t want to manually clear the mock (or you are afraid of forgetting),
you can use the provided contextmanager.
Limitations
Even though the class is a subclass of ,
there are some rare cases where it can’t replace the native class directly.
Here is a list (non-exhaustive) of the reported cases with a possible solution, if any:
-
will use the the function to determine the type of the object by default. To work around it you can register a new adapter:
-
(former ) and will use the the function to determine the type of the object by default. To work around it you can register a new adapter:
-
will use the method to store datetimes in the database. However, since is always timezone aware, the offset information will always be returned by raising an error, at least for MySQL databases. To work around it, you can either create your own or use the previous workaround for :
Работа с unix timestamp/time на python
Совсем недавно, я начал свое изучение python. Мне потребовалось несколько дней для того чтобы начать писать на нем элементарные вещи. И мне бы хотелось сохранять полезную информацию в виде своих заметок и для питон.
Как преобразовать unix timestamp в datetime на Python?
Делается это очень просто:
#!/bin/env python3 import datetime timestamp = 1339521878.04 value = datetime.datetime.fromtimestamp(timestamp) print(value.strftime('%Y-%m-%d %H:%M:%S'))
Чтобы получить datetime времени (сейчас), можно выполнить:
#!/bin/env python3 import datetime,time dt = datetime.datetime.now() value = datetime.datetime.fromtimestamp(time.mktime(dt.timetuple())) print(value.strftime('%Y-%m-%d %H:%M:%S'))
Вывод будет следующим:
2017-08-04 14:25:21
Как преобразовать datetime в timestamp на Python?
Делается это очень просто:
#!/bin/env python3 from datetime import datetime import time # time tuple in local time to timestamp time_tuple = (2017, 11, 12, 13, 59, 27, 2, 317, 0) timestamp = time.mktime(time_tuple) print (repr(timestamp)) # time tuple in utc time to timestamp time_tuple_utc = (2017, 11, 12, 13, 59, 27, 2, 317, 0) timestamp_utc = calendar.timegm(time_tuple_utc) print (repr(timestamp_utc))
Конвертация в строку:
#!/bin/env python3 from datetime import datetime import time # datetime object to string dt_obj = datetime(2017, 11, 10, 17, 53, 59) date_str = dt_obj.strftime("%Y-%m-%d %H:%M:%S") print (date_str) # time tuple to string time_tuple = (2017, 11, 12, 13, 51, 18, 2, 317, 0) date_str = time.strftime("%Y-%m-%d %H:%M:%S", time_tuple) print (date_str)
Конвертация в datetime:
#!/bin/env python3 from datetime import datetime import time # time tuple to datetime object time_tuple = (2017, 11, 12, 13, 51, 18, 2, 317, 0) dt_obj = datetime(*time_tuple) print (repr(dt_obj)) # date string to datetime object date_str = "2017-11-10 17:53:59" dt_obj = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S") print (repr(dt_obj)) # timestamp to datetime object in local time timestamp = 1226527167.595983 dt_obj = datetime.fromtimestamp(timestamp) print (repr(dt_obj)) # timestamp to datetime object in UTC timestamp = 1226527167.595983 dt_obj = datetime.utcfromtimestamp(timestamp) print (repr(dt_obj))
Получаем вывод:
datetime.datetime(2017, 11, 12, 13, 51, 18) datetime.datetime(2017, 11, 10, 17, 53, 59) datetime.datetime(2008, 11, 12, 23, 59, 27, 595983) datetime.datetime(2008, 11, 12, 21, 59, 27, 595983)
Конвертация time tuples:
#!/bin/env python3 from datetime import datetime import time # datetime object to time tuple dt_obj = datetime(2017, 11, 10, 17, 53, 59) time_tuple = dt_obj.timetuple() print (repr(time_tuple)) # string to time tuple date_str = "2017-11-10 17:53:59" time_tuple = time.strptime(date_str, "%Y-%m-%d %H:%M:%S") print (repr(time_tuple)) # timestamp to time tuple in UTC timestamp = 1226527167.595983 time_tuple = time.gmtime(timestamp) print (repr(time_tuple)) # timestamp to time tuple in local time timestamp = 1226527167.595983 time_tuple = time.localtime(timestamp) print (repr(time_tuple))
Получим вывод:
time.struct_time(tm_year=2017, tm_mon=11, tm_mday=10, tm_hour=17, tm_min=53, tm_sec=59, tm_wday=4, tm_yday=314, tm_isdst=- 1) time.struct_time(tm_year=2017, tm_mon=11, tm_mday=10, tm_hour=17, tm_min=53, tm_sec=59, tm_wday=4, tm_yday=314, tm_isdst=- 1) time.struct_time(tm_year=2008, tm_mon=11, tm_mday=12, tm_hour=21, tm_min=59, tm_sec=27, tm_wday=2, tm_yday=317, tm_isdst=0 ) time.struct_time(tm_year=2008, tm_mon=11, tm_mday=12, tm_hour=23, tm_min=59, tm_sec=27, tm_wday=2, tm_yday=317, tm_isdst=0 )
Вот и все.
Метод after() — Погружение в сон для Tkinter
tkinter является частью стандартной библиотеки Python. В случае, если вы используете заранее установленную версию Python на Linux или Mac, он может быть вам недоступен. При получении ошибки стоит самостоятельно добавить его в систему. В том случае, если вы ранее установили Python сами, должен быть доступен.
Начнем с разбора примера, где используется . Запустите следующий код и посмотрите, что произойдет при неправильном добавлении вызова в Python:
Python
import tkinter
import time
class MyApp:
def __init__(self, parent):
self.root = parent
self.root.geometry(«400×400″)
self.frame = tkinter.Frame(parent)
self.frame.pack()
b = tkinter.Button(text=»click me», command=self.delayed)
b.pack()
def delayed(self):
time.sleep(3)
if __name__ == «__main__»:
root = tkinter.Tk()
app = MyApp(root)
root.mainloop()
1 15 |
importtkinter importtime classMyApp def__init__(self,parent) self.root=parent self.root.geometry(«400×400») self.frame=tkinter.Frame(parent) self.frame.pack() b=tkinter.Button(text=»click me»,command=self.delayed) b.pack() defdelayed(self) if__name__==»__main__» root=tkinter.Tk() app=MyApp(root) root.mainloop() |
После запуска кода нажмите кнопку в GUI. Кнопка не будет реагировать три секунды, ожидая завершения . Если в приложении есть другие кнопки, на них тоже нельзя будет нажать. Закрыть приложение во время сна нельзя, так как оно не будет откликаться на событие закрытия.
Для должного погружения в сон потребуется использовать :
Python
import tkinter
class MyApp:
def __init__(self, parent):
self.root = parent
self.root.geometry(«400×400»)
self.frame = tkinter.Frame(parent)
self.frame.pack()
self.root.after(3000, self.delayed)
def delayed(self):
print(‘Я задержался’)
if __name__ == «__main__»:
root = tkinter.Tk()
app = MyApp(root)
root.mainloop()
1 10 |
importtkinter classMyApp def__init__(self,parent) self.root=parent self.root.geometry(«400×400») self.frame=tkinter.Frame(parent) self.frame.pack() defdelayed(self) print(‘Я задержался’) if__name__==»__main__» root=tkinter.Tk() app=MyApp(root) root.mainloop() |
Здесь создается приложение, высота которого 400 пикселей, и ширина также 400 пикселей. На нем нет виджетов. Оно только показывает фрейм. Затем вызывается , где является отсылкой к объекту . принимает два аргумента:
- Количество миллисекунд для сна;
- Метод который вызовется после завершения сна.
В данном случае приложение выведет строку в стандартный поток вывода (stdout) через 3 секунды. Можно рассматривать как Tkinter-версию того же , только он добавляет способность вызова функции после завершения сна.
Данную функциональность можно использовать для улучшения работы пользователя. Добавив в Python вызов , можно ускорить процесс загрузки приложения, после чего начать какой-то длительный процесс. В таком случае пользователю не придется ждать открытия приложения.
Как открыть HEIC
Работа с часовыми поясами
К сожалению у меня нет большого опыта работы с часовыми поясами и примеры ниже не стоит рассматривать как лучшие практики.
Библиотека datetime не хранит часовые пояса, данные о переводах часов (летнее и зимнее время) и високосных секундах. К тому же, некоторые страны, могут изменить время опираясь на локальные ситуации. Эти ситуации опасны, когда идет запись в базу данных. Для вывода в GUI, можно использовать datetime.datetime.now() или высчитывать часовой пояс из базы.
Для записи в базу данных мы можем использовать время UTC и отдельно считать часовой пояс:
Следующий пример вычислит разницу времени между UTC и локальным. Насколько я знаю он может не сработать на версиях Python < 3.3:
Для вычисления других часовых поясов можно использовать стороннюю библиотеку pytz, которая их хранит:
Вывести все часовые пояса мы можем так:
На примере ниже я перевожу локальное время в часовой пояс Киева:
Теги:
#python
#datetime
Связанные темы и праздники
Получение текущего объекта datetime
Теперь для большинства реальных программ можно использовать текущее время и сохранить его как объект datetime. Мы можем использовать функцию datetime.now() для отображения текущего времени как объекта datetime.
from datetime import datetime
Давайте теперь рассмотрим пример.
from datetime import datetime current_datetime = datetime.now() print(current_datetime)
Выход
datetime.datetime(2020, 6, 27, 22, 45, 54, 267673)
Выход совпадает. В нем указано, что текущее время — 27 июня 2020 года, 22:45:54 по моему местному часовому поясу (IST).
Теперь мы также можем использовать базовые операторы для получения прошлого или будущего времени.
from datetime import datetime, timedelta current_datetime = datetime.now() # future dates one_year_future_date = current_datetime + timedelta(days=365) print('Current Date:', current_datetime) print('One year from now Date:', one_year_future_date) # past dates three_days_before_date = current_datetime - timedelta(days=3) print('Three days before Date:', three_days_before_date)
Выход
Current Date: 2020-06-27 22:45:54.267673 One year from now Date: 2021-06-27 22:45:54.267673 Three days before Date: 2020-06-24 22:45:54.267673
Главные критерии выбора плиткореза
В первую очередь необходимо определить цель покупки. Домашнему мастеру, который решил самостоятельно положить обычную керамическую плитку в квартире или доме, подойдет простой механический плиткорез. Но если требуется сделать в плитке много отверстий под коммуникации, то стоит присмотреться к моделям с балеринкой.
-
Профессионалы ценят в инструменте несколько качеств. Он должен делать идеально ровный рез или пропил. При этом работа должна выполняться быстро и легко.
-
Достаточно много времени мастеру приходится тратить на выполнение замеров. Поэтому модели с линейкой или лазерным лучом выглядят предпочтительнее. Добиться точности во время резания позволяют упоры.
-
При выборе плиткореза следует учесть и наличие электросети в строящемся объекте. Если требуется поддерживать высокие темпы отделки при отсутствии электричества, на выручку придет инструмент с аккумуляторным приводом.
В наш обзор попали лучшие плиткорезы. При составлении рейтинга учитывались следующие критерии:
-
назначение инструмента;
-
технические характеристики;
-
цена;
-
мнение экспертов;
-
отзывы домашних мастеров.
Способы реализации параллельных вычислений в программах на Python.
Что такое параллелизм?
Параллелизм дает возможность работать над несколькими вычислениями одновременно в одной программе. Такого поведения в Python можно добиться несколькими способами:
- Используя многопоточность ||, позволяя нескольким потокам работать по очереди.
- Используя многопроцессорность ||. Делать сразу несколько вычислений, используя несколько ядер процессора. Это и называется параллелизмом.
- Используя асинхронный ввод-вывод с модулем . Запуская какую то задачу, продолжать делать другие вычисления, вместо ожидания ответа от сетевого подключения или от операций чтения/записи.
Разница между потоками и процессами.
Поток — это независимая последовательность выполнения каких то вычислений. Поток делит выделенную память ядру процессора, а так же его процессорное время со всеми другими потоками, которые создаются программой в рамках одного ядра процессора. Программы на языке Python имеют, по умолчанию, один основной поток. Можно создать их больше и позволить Python переключаться между ними. Это переключение происходит очень быстро и кажется, что они работают параллельно.
Понятие процесс в — представляет собой так же независимую последовательность выполнения вычислений. В отличие от потоков , процесс имеет собственное ядро и следовательно выделенную ему память, которое не используется совместно с другими процессами. Процесс может клонировать себя, создавая два или более экземпляра в одном ядре процессора.
Асинхронный ввод-вывод не является ни потоковым (), ни многопроцессорным (). По сути, это однопоточная, однопроцессная парадигма и не относится к параллельным вычислениям.
У Python есть одна особенность, которая усложняет параллельное выполнение кода. Она называется GIL, сокращенно от Global Interpreter Lock. GIL гарантирует, что в любой момент времени работает только один поток. Из этого следует, что с потоками невозможно использовать несколько ядер процессора.
GIL был введен в Python потому, что управление памятью CPython не является потокобезопасным. Имея такую блокировку Python может быть уверен, что никогда не будет условий гонки.
Что такое условия гонки и потокобезопасность?
-
Состояние гонки возникает, когда несколько потоков могут одновременно получать доступ к общей структуре данных или местоположению в памяти и изменять их, в следствии чего могут произойти непредсказуемые вещи…
Пример из жизни: если два пользователя одновременно редактируют один и тот же документ онлайн и второй пользователь сохранит данные в базу, то перезапишет работу первого пользователя. Чтобы избежать условий гонки, необходимо заставить второго пользователя ждать, пока первый закончит работу с документом и только после этого разрешить второму пользователю открыть и начать редактировать документ.
-
Потокобезопасность работает путем создания копии локального хранилища в каждом потоке, чтобы данные не сталкивались с другим потоком.
Алгоритм планирования доступа потоков к общим данным.
Как уже говорилось, потоки используют одну и ту же выделенную память. Когда несколько потоков работают одновременно, то нельзя угадать порядок, в котором потоки будут обращаются к общим данным. Результат доступа к совместно используемым данным зависит от алгоритма планирования. который решает, какой поток и когда запускать. Если такого алгоритма нет, то конечные данные могут быть не такими как ожидаешь.
Например, есть общая переменная . Теперь предположим, что есть два потока, и . Они выполняют следующие операции:
a = 2 # функция 1 потока def thread_one(): global a a = a + 2 # функция 2 потока def thread_two(): global a a = a * 3
Если поток получит доступ к общей переменной первым и вторым, то результат будет 12:
- 2 + 2 = 4;
- 4 * 3 = 12.
или наоборот, сначала запустится , а затем , то мы получим другой результат:
- 2 * 3 = 6;
- 6 + 2 = 8.
Таким образом очевидно, что порядок выполнения операций потоками имеет значение
Без алгоритмов планирования доступа потоков к общим данным такие ошибки очень трудно найти и произвести отладку. Кроме того, они, как правило, происходят случайным образом, вызывая беспорядочное и непредсказуемое поведение.
Есть еще худший вариант развития событий, который может произойти без встроенной в Python блокировки потоков GIL . Например, если оба потока начинают читать глобальную переменную одновременно… Оба потока увидят, что , а дальше, в зависимости от того какой поток произведет вычисления последним, в конечном итоге и будет равна переменная (4 или 6). Не то, что ожидалось!
Вызов sleep() в Tkinter и wxPython
Вызовы в Python можно добавить не только для приложений командной строки. При создании графического пользовательского интерфейса (GUI) периодически нужно добавлять отсрочки. К примеру, при создании приложения FTP для скачивания около миллиона файлов будет разумно добавить вызов между партиями, чтобы снизить нагрузку на сервер.
GUI код выполнит всю обработку в основном потоке, называемом циклом обработки событий, или event loop. При использовании внутри кода GUI заблокируется цикл обработки событий.
К счастью, помимо , можно использовать некоторые другие методы специально для этой задачи. Далее мы рассмотрим, как добавить вызовы в Tkinter и wxPython.
Python Interface¶
The module defines three convenience functions and a public class:
- (stmt=’pass’, setup=’pass’, timer=<default timer>, number=1000000, globals=None)
-
Create a instance with the given statement, setup code and
timer function and run its method with number executions.
The optional globals argument specifies a namespace in which to execute the
code.Changed in version 3.5: The optional globals parameter was added.
- (stmt=’pass’, setup=’pass’, timer=<default timer>, repeat=5, number=1000000, globals=None)
-
Create a instance with the given statement, setup code and
timer function and run its method with the given repeat
count and number executions. The optional globals argument specifies a
namespace in which to execute the code.Changed in version 3.5: The optional globals parameter was added.
Changed in version 3.7: Default value of repeat changed from 3 to 5.
- ()
-
The default timer, which is always .
Changed in version 3.3: is now the default timer.
datetime.datetime
Объект datetime.datetime содержит всю информацию объектов datetime.date плюс datetime.time. Давайте приведем несколько примеров, для лучшего понимания разницы между этим объектом, и объектом datetime.date.
Python
import datetime
a = datetime.datetime(2017, 3, 5)
print(a) # datetime.datetime(2017, 3, 5, 0, 0)
b = datetime.datetime(2017, 3, 5, 12, 30, 10)
print(b) # datetime.datetime(2017, 3, 5, 12, 30, 10)
d = datetime.datetime(2017, 3, 5, 12, 30, 10)
print(d.year) # 2017
print(d.second) # 10
print(d.hour) # 12
1 |
importdatetime a=datetime.datetime(2017,3,5) print(a)# datetime.datetime(2017, 3, 5, 0, 0) b=datetime.datetime(2017,3,5,12,30,10) print(b)# datetime.datetime(2017, 3, 5, 12, 30, 10) d=datetime.datetime(2017,3,5,12,30,10) print(d.year)# 2017 print(d.second)# 10 print(d.hour)# 12 |
Мы видим, что datetime.datetime принимает несколько дополнительных аргументов: год, месяц, день, час, минута и секунда. Это также позволяет вам указывать информацию о микросекундах и часовом поясе. При работе с базами данных, данные типы объектов будут использоваться достаточно часто. Большую часть вашей работы, вам нужно будет конвертировать форматы date или datetime Python в форматы SQL datetime или timestamp
Обратите внимание на то, что today совместно с datetime.datetime использует два разных метода:
Python
import datetime
a = datetime.datetime.today()
print(a) # datetime.datetime(2017, 4, 5, 0, 16, 54, 989663)
b = datetime.datetime.now()
print(b) # datetime.datetime(2017, 4, 5, 0, 17, 8, 24239)
1 |
importdatetime a=datetime.datetime.today() print(a)# datetime.datetime(2017, 4, 5, 0, 16, 54, 989663) b=datetime.datetime.now() print(b)# datetime.datetime(2017, 4, 5, 0, 17, 8, 24239) |
Модуль datetime содержит другой метод, под названием strftime. Этот метод позволяет разработчику создавать строку, отображающую время в более понятной для человека форме. Существует целая таблица параметров форматирования, с которой рекомендуется ознакомиться в документации Python, в . Давайте взглянем на несколько примеров, показывающих всю полезность данного метода:
Python
import datetime
a = datetime.datetime.today().strftime(«%Y%m%d»)
print(a) # ‘20170405’
today = datetime.datetime.today()
print( today.strftime(«%m/%d/%Y») ) # ’04/05/2017′
print( today.strftime(«%Y-%m-%d-%H.%M.%S») ) # 2017-04-05-00.18.00
1 |
importdatetime a=datetime.datetime.today().strftime(«%Y%m%d») print(a)# ‘20170405’ today=datetime.datetime.today() print(today.strftime(«%m/%d/%Y»))# ’04/05/2017′ print(today.strftime(«%Y-%m-%d-%H.%M.%S»))# 2017-04-05-00.18.00 |
Первый пример – это скорее хитрость. В нем показано, как конвертировать сегодняшний объект datetime в строку, следующую за форматом YYYYMMDD (ГГГГММДД). Второй пример более наглядный.
В нем мы присваиваем объект datetime переменной под названием today и применяем два разных параметра форматирования строки. Первый параметр добавляет косые черточки между элементами datetime, а также перегруппировывает datetime, теперь он делится на месяц, день и год. В последнем примере мы создаем временную отметку, которая следует типичному формату: YYYY-MM-DD.HH.MM.SS. Если вам нужно указать год как двухзначный (“YY”), вы можете заменить %Y на %y.
Что дальше: многозадачность и оптимизация
Наша программа уже работает как нужно, но её можно улучшить. Дело в том, что ставить весь код на паузу — не самое удачное решение с точки зрения производительности. Представьте, что вам нужно поставить себе несколько напоминаний на разное время. С таким подходом нам придётся выяснять, какое сработает раньше, потом корректировать время паузы для следующего напоминания и так далее.
Можно сделать так: выносить напоминания в отдельные потоки. Это как подпрограмма, которая работает параллельно с нашей программой и не сильно зависит от неё. Это позволит не ждать первого события, а запускать их одновременно. Но про всё это — в следующем материале.
Модуль time
Модуль time открывает разработчику Python доступ к нескольким связанным со временем функциям. Модуль основан на «эпохе», точке, с которой начинается время. Для систем Unix, эпоха началась в 1970 году. Чтобы узнать, какая эпоха в вашей системе, попробуйте запустить следующий код:
Python
import time
print(time.gmtime(0))
1 |
importtime print(time.gmtime()) |
Результат
Python
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)
1 |
time.struct_time(tm_year=1970,tm_mon=1,tm_mday=1,tm_hour=,tm_min=,tm_sec=\ ,tm_wday=3,tm_yday=1,tm_isdst=) |
Я запустил его на Windows 7, которая также уверена в том, что начало времен датируется 1970м годом. В любом случае, в данном разделе мы ознакомимся со следующими функциями:
- time.ctime
- time.sleep
- time.strftime
- time.time
Приступим!