След година разработка значителен издаден език за програмиране . Python 3.9 стана първото издание след проекта на подготовка и поддръжка на издания. Новите значителни издания вече ще бъдат формулирани веднъж годишно, а коригиращите актуализации ще бъдат издавани на два месеца. Всяка значителна версия ще се поддържа в течение на година и половина, след което ще бъдат формулирани корекции за уязвимости в следващите три години и половина.
Работата по новата версия сега започва пет месеца преди издаването на поредната версия, т.е. едновременно с издаването на Python 3.9 алфа-тестовете на версия Python 3.10. Версия Python 3.10 ще бъде в етап алфа-издания в течение на седем месеца, през които ще бъдат добавяни нови възможности и поправки на грешки. След това в продължение на три месеца ще се извършва тестване на бета-версии, през което добавянето на нови възможности ще бъде забранено и всичкото внимание ще бъде насочено към поправки на грешки. Последните два месеца преди издаването версията ще бъде в етап кандидат за издания, на който ще бъде извършена финална стабилизация.
в Python 3.9:
- В речниците, създадени с вградения клас dict, подкрепа на операторите за сливане «|» и обновление «|=», които допълват методите {**d1, **d2} и dict.update, преди предлагани за обединение на речници.
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}>>> x | y
{"key1": "value1 from x", "key2": "value2 from y", "key3": "value3 from y"}>>> y | x
{"key2": "value2 from x", "key3": "value3 from y", "key1": "value1 from x"} - Вградена колекция от типове включва list, dict и tuple, които могат да се използват като основни типове без импортиране от модула typing. Т.е. вместо typing.List, typing.Dict и typing.Tuple сега може да се измерва
просто list, dict и tuple:def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name) - гъвкави средства за анотиране на функции и променливи. За прикрепяне на анотации в модула typing е добавен нов тип Annotated, който разширява съществуващите типове с допълнителни метаданни, които могат да се използват при статичен анализ или за оптимизация по време на изпълнение. За достъп до метаданните от кода в метода typing.get_type_hints() е добавен параметър include_extras.
charType = Annotated[int, ctype("char")]
UnsignedShort = Анотировани[int, struct2.ctype(‘H’)] - граматични изисквания към декораторите — всяко изразяване, подходящо за използване в блокове if и while, сега може да се използва като декоратор. Промените значително подобриха четивността на кода PyQt5 и опростиха поддръжката на този модул:
Беше:
button_0 = buttons[0]
@button_0.clicked.connectСега можете да напишете:
@buttons[0].clicked.connect - В стандартната библиотека модул , включваща информация от базата за времеви зони на IANA.
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Летно време
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo(«America\/Los_Angeles»))
>>> print(dt)
2020-10-31 12:00:00-07:00>>> dt.tzname()
‘PDT’>>> # Стандартно време
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00>>> print(dt.tzname())
PST - Добавен е модул graphlib, в който се поддържа топологично сортиране на графи.
- нови методи за премахване на префикси и окончания на низове — str.removeprefix(prefix) и str.removesuffix(suffix). Методите са добавени към обектите str, bytes, bytearray и collections.UserString.
>>> s = «FooBar»
>>> s.removeprefix(«Foo»)
‘Bar’ - нов парсер (Parsing Expression Grammar), който замести парсера . Прилагането на новия парсер позволи да се избегнат някои "хакове", използвани за заобикаляне на ограниченията в LL(1), и значително намали разходите за поддръжка на парсера. По производителност новият парсер е на приблизително същото ниво като предишния, но значително го превъзхожда на гъвкавост, което позволява по-свободно проектиране на нови възможности на езика. Кодът на стария парсер все още е запазен и може да бъде възстановен с флага "-X oldparser" или променливата на средата "PYTHONOLDPARSER=1", но ще бъде премахнат в версия 3.10.
- възможността методите на C-разширения да получават достъп до състоянието на модулите, в които са дефинирани, с използването на директно разименуване на указатели вместо намиране на състоянието на модула с функцията PyState_FindModule. Промените позволяват увеличаване на производителността на C-модулите чрез намаляване или пълно елиминиране на разходите за проверка на състоянието на модула. За асоцииране на модула с клас е предложена C-функцията PyType_FromModuleAndSpec(), за получаване на модула и неговото състояние C-функциите PyType_GetModule() и PyType_GetModuleState(), а за предоставяне на метода достъп до класа, в който е дефиниран, C-функцията PyCMethod и флаг METH_METHOD.
- Сборщик на боклук от блокировка на колекции, включващи реанимирани обекти, които остават достъпни отвън след стартиране на финализатора.
- Добавен е метод , позволяващ използването на подсистемата на ядрото Linux «pidfd» за обработка на ситуацията с повторно използване на PID (pidfd е свързан с конкретен процес и не се променя, докато PID може да бъде свързан с друг процес след приключването на текущия процес, асоцииран с този PID).
- Поддръжката на спецификацията Unicode е обновена до версия 13.0.0.
- Отстранена при повторна инициализация на интерпретатора Python в един процес.
- Извършена е оптимизация на производителността на вградени типове range, tuple, set, frozenset, list и dict, чрез прилагане на протокола за бързо извикване Vectorcall за по-бърз достъп до обекти, написани на C.
- Модулите _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time и _weakref са преведени за зареждане с .
- Модулите на стандартната библиотека audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios и zlib са преведени за използване на ограничен , който решава проблема с работоспособността на сборките на разширителни модули за различни версии на Python (при обновление на версията не се изисква повторно свиване на разширителни модули, и модулите, събрани за 3.9, ще могат да работят в клон 3.10).
- В модула asyncio поради потенциални проблеми със сигурността е прекратена поддръжката на параметъра reuse_address (използването на SO_REUSEADDR за UDP в Linux позволява на различни процеси да свързват слушателски сокети с UDP порта).
- Добавени са нови оптимизации, например, повишена производителност на обработчиците на сигнали в многопоточни приложения, подобрена скорост на работа на модула subprocess в среда FreeBSD и ускорено присвояване на временни променливи (присвояването на променлива в израза «for y in [expr]» вече не отстъпва по производителност на израза «y = expr»). По принцип повечето тестове показват намаляване на производителността в сравнение с клона 3.8 (ускорение се наблюдава само в тестовете write_local и write_deque):
Версия Python 3.4 3.5 3.6 3.7 3.8 3.9
————— — — — — — —Достъп за четене на променливи и атрибути:
read_local 7.1 7.1 5.4 5.1 3.9 4.0
read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8
read_global 15.5 19.0 14.3 13.6 7.6 7.7
read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
прочитване на classvar от клас 25.6 26.5 20.7 19.5 18.4 18.6
прочитване на classvar от инстанция 22.8 23.5 18.8 17.1 16.4 20.1
прочитване на instancevar 32.4 33.1 28.0 26.3 25.4 27.7
прочитване на instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
прочитване на namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
прочитване на boundmethod 37.6 37.9 29.6 26.9 27.7 45.9Достъп за запис на променливи и атрибути:
записване на локално 8.7 9.3 5.5 5.3 4.3 4.2
записване на нелокално 10.5 11.1 5.6 5.5 4.7 4.9
записване на глобално 19.7 21.2 18.0 18.0 15.8 17.2
записване на classvar 92.9 96.0 104.6 102.1 39.2 43.2
записване на instancevar 44.6 45.8 40.0 38.9 35.5 40.7
записване на instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7Достъп за четене на структури от данни:
прочитане на списък 24.2 24.5 20.8 20.8 19.0 21.1
прочитане на deque 24.7 25.5 20.2 20.6 19.8 21.6
прочитане на речник 24.3 25.7 22.3 23.0 21.0 22.5
прочитане на strdict 22.6 24.3 19.5 21.2 18.9 21.6Достъп за запис на структури от данни:
записване на списък 27.1 28.5 22.5 21.6 20.0 21.6
записване на deque 28.7 30.1 22.7 21.8 23.5 23.2
записване на речник 31.4 33.3 29.3 29.2 24.7 27.8
записване на strdict 28.4 29.9 27.5 25.2 23.1 29.8Операции със стек (или опашка):
list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9
deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5
deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5Времето за цикъл:
разходи за цикъл 0.5 0.6 0.4 0.3 0.3 0.3 - много функции и методи на Python 2.7, които преди бяха отбелязани като остарели и в миналото доведоха до предупреждение DeprecationWarning, включително метод unescape() в html.parser.HTMLParser,
tostring() и fromstring() в array.array, isAlive() в threading.Thread, getchildren() и getiterator() в ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() и base64.decodestring().
Източник: opennet.ru
