Долгожданный релиз Python 3.11
24 октября 2022 года вышла новая версия Python за номером 3.11. Что нового нас ожидает?
Производительность
В последних версиях Python очень много внимания уделялось самому слабому месту языка, а именно низкой производительности, суровой плате за динамическую типизацию и использование интерпретатора. Благодаря проекту faster CPython, основной интерпретатор Python теперь работает на 10-60% быстрее. В этот раз его команда сфокусировалась на двух задачах: ускорении запуска и работы. Теперь CPython запускается на 10-15% быстрее. Это стало возможным благодаря "заморозке" импортов. Еще в версии 3.10 для импорта модуля приходилось выполнять цепочку операций.
Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate
Теперь эти объекты и их байт-код статически распределяются, что предельно упрощает импорт:
Statically allocated code object -> Evaluate
Ускорение работы стало возможным благодаря оптимизации стековых кадров. В новой версии:
- упрощен процесс создания стековых кадров;
- пространство кадра переиспользуется в стеке C, что позволяет избежать выделения лишней памяти;
- из фреймов убрали дополнительную информацию (связанную с отладкой и менеджментом памяти)
"Старые" кадры теперь создаются только по запросам отладчика или интроспективных функций, а для большей части кода объекты кадров вообще не создаются. Это позволило поднять скорость выполнения функций на 3-7%.
Встроенные вызовы функций также оптимизировали. Теперь интерпретатор избегает вызова функции интерпретации С при работе с ними, что является отличной новостью для всех, кто работает с рекурсиями. Так, простые рекурсивные функции теперь работают в 1.7 раз быстрее. Это улучшило общую производительность на 1-3%.
Еще одно новшество — специализированный адаптивный интерпретатор. Несмотря на то, что Python - динамический язык, в коде есть множество фрагментов, где объекты и типы очень редко изменяются. Этот концепт назівается стабильностью типов. Теперь интерпретатор распознает такие места и заменяет ресурсоёмкие операции на более специализированные, кэшированные в байт-коде. CPython специализирует только те участки кода, которые активно используются, а если специализированный участок становится слишком динамичным — деспециализирует его.
Ускорение затронуло и более специализированные моменты. Например, блоки исключений теперь работают моментально, если исключение не брошено. К тому же, блок ловит исключение на 10% быстрее, чем раньше. Оптимизация пространств имен у объектов привела к снижению их размера.
Разработчики планируют и дальше улучшать производительность, что должно в разы ускорить работу CPython. В следующих версиях нам обещают дальнейшую оптимизацию и даже полноценную динамическую компиляцию. При этом одним из важнейших принципов остается совместимость со всеми версиями Python 3. Остается только пожелать им удачи в этом непростом деле, и перейти к новым фичам.
Важные изменения
Трассировка вызовов теперь будет еще более подробной. Теперь интерпретатор указывает не просто строку, а конкретное выражение, вызвавшее ошибку.
Traceback (most recent call last):
File "distance.py", line 11, in <module>
print(manhattan_distance(p1, p2))
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "distance.py", line 6, in manhattan_distance
return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'
Особо полезна новая тарссировка при работе со вложенными словарями и сложными арифметическими операциями.
Исключения
Добавлена поддержка групп исключений. Для этого созданы два новых типа исключений: BaseExceptionGroup
и ExceptionGroup
. Достать отдельніе исключения из группы можно с помощью выражения except*
. В BaseException
добавлен метод add_note()
, позволяющий прикрепить к исключению примечание.
Значительно расширены возможности аннотации типов.
Добавлена новая аннотация Self
, для обозначения экземпляров класса. Его можно использовать для альтернативных конструкторов и методов __enter__
.
Аннотация LiteralString
нужна для ограничения передачи функциям строковых аргументов, в которые можно подставить другие строки. Это поможет обезопасить формирование SQL-запросов shell-команд.
Аннотация TypeVarTuple
аналогична TypeVar
, но позволяет использовать произвольное количество типов.
Добавлен декоратор классов, методов и функций @dataclass_transform, при указании которого система проверки статических типов трактует объект, как при использовании декоратора @dataclasses.dataclass. В примере ниже класс CustomerModel при проверке типов будет обработан по аналогии с классом с декоратором @dataclasses.dataclass, т.е. как имеющий метод init, допускающий переменные id и name.
При помощи новой функции dataclass_transform
можно декорировать классы, метаклассы или функции, чтобы проверки типов воспринимали их, как класс данных.
@typing.dataclass_transform()
def create_model(cls: Type[T]) -> Type[T]:
cls.__init__ = ...
cls.__eq__ = ...
cls.__ne__ = ...
return cls
# Декоратор create_model теперь можно использовать для создания новых модельных классов:
@create_model
class CustomerModel:
id: int
name: str
c = CustomerModel(id=327, name="Eric Idle")
Другие интересные изменения
- Распаковка коллекций теперь работает с оператором
for
. - В стандартную библиотеку добавлены новые модули: tomllib для парсинга TOML и wsgiref.types - WSGI-специфические типы для проверки статической типизации.
- Методы класса больше не могут заключать в себе другие дескрипторы. Эта возможность приводила к целой цепочке проблем. Разработчики рекомендуют использовать аттрибут
__wrapped__
, добавленный в Python 3.10, чтобі избежать проблем. - Обновлено множество модулей из стандартной библиотеки. Ознакомиться с другими небольшими изменениями, которые могут повлиять на ваши проекты можно на сайте python.org
Послесловие
Python продолжает стремительно развиваться. В новой версии языка много внимания уделено повышению производительности. Пока что ускорение идет очень неравномерно, и существующие проекты могут практически не ощутить прироста скорости. Но оптимизировав узкие места с учетом нововведений, можно добиться хороших результатов. Будем надеяться, что под эгидой Microsoft Python наконец-то избавится от клейма неповоротливого языка, и планы ускорить CPython в пять раз за четыре года будут реализованы. То, что мы видим в версии 3.11 может быть неплохим началом, но по-настоящему серьезные изменения еще только намечаются.
Возможно будет интересно
🏆 Hello, world!
Мы вчера запустили новый www.pylot.me. Должны были в следующую среду, но запустили вчера.
Как практиковаться в Python?
Для улучшения качества знаний и повышения уровня программиста, необходим постоянный практикум. Где можно это организовать самостоятельно, и как практиковаться в Python?
Условные конструкции и сопоставление структурных шаблонов
Шпаргалка по условным конструкциям и сопоставлению структурных шаблонов