What’s New In Python 3.11

Editor:

Pablo Galindo Salgado

This article explains the new features in Python 3.11, compared to 3.10.Python 3.11 was released on October 24, 2022.For full details, see thechangelog.

Summary – Release highlights

  • Python 3.11 is between 10-60% faster than Python 3.10.On average, we measured a 1.25x speedup on the standard benchmark suite.SeeFaster CPython for details.

New syntax features:

New built-in features:

New standard library modules:

Interpreter improvements:

New typing features:

Important deprecations, removals and restrictions:

New Features

PEP 657: Fine-grained error locations in tracebacks

When printing tracebacks, the interpreter will now point to the exact expressionthat caused the error, instead of just the line. For example:

Traceback(mostrecentcalllast):File"distance.py",line11,in<module>print(manhattan_distance(p1,p2))^^^^^^^^^^^^^^^^^^^^^^^^^^File"distance.py",line6,inmanhattan_distancereturnabs(point_1.x-point_2.x)+abs(point_1.y-point_2.y)^^^^^^^^^AttributeError:'NoneType'objecthasnoattribute'x'

Previous versions of the interpreter would point to just the line, making itambiguous which object wasNone. These enhanced errors can also be helpfulwhen dealing with deeply nesteddict objects and multiple function calls:

Traceback(mostrecentcalllast):File"query.py",line37,in<module>magic_arithmetic('foo')File"query.py",line18,inmagic_arithmeticreturnadd_counts(x)/25^^^^^^^^^^^^^File"query.py",line24,inadd_countsreturn25+query_user(user1)+query_user(user2)^^^^^^^^^^^^^^^^^File"query.py",line32,inquery_userreturn1+query_count(db,response['a']['b']['c']['user'],retry=True)~~~~~~~~~~~~~~~~~~^^^^^TypeError:'NoneType'objectisnotsubscriptable

As well as complex arithmetic expressions:

Traceback(mostrecentcalllast):File"calculation.py",line54,in<module>result=(x/y/z)*(a/b/c)~~~~~~^~~ZeroDivisionError:divisionbyzero

Additionally, the information used by the enhanced traceback featureis made available via a general API, that can be used to correlatebytecodeinstructions with source code location.This information can be retrieved using:

SeePEP 657 for more details. (Contributed by Pablo Galindo, Batuhan Taskayaand Ammar Askar inbpo-43950.)

Note

This feature requires storing column positions inCode Objects,which may result in a small increase in interpreter memory usageand disk usage for compiled Python files.To avoid storing the extra informationand deactivate printing the extra traceback information,use the-Xno_debug_ranges command line optionor thePYTHONNODEBUGRANGES environment variable.

PEP 654: Exception Groups andexcept*

PEP 654 introduces language features that enable a programto raise and handle multiple unrelated exceptions simultaneously.The builtin typesExceptionGroup andBaseExceptionGroupmake it possible to group exceptions and raise them together,and the newexcept* syntax generalizesexcept to match subgroups of exception groups.

SeePEP 654 for more details.

(Contributed by Irit Katriel inbpo-45292. PEP written byIrit Katriel, Yury Selivanov and Guido van Rossum.)

PEP 678: Exceptions can be enriched with notes

Theadd_note() method is added toBaseException.It can be used to enrich exceptions with context informationthat is not available at the time when the exception is raised.The added notes appear in the default traceback.

SeePEP 678 for more details.

(Contributed by Irit Katriel inbpo-45607.PEP written by Zac Hatfield-Dodds.)

Windowspy.exe launcher improvements

The copy of thePython Launcher for Windows included with Python 3.11 has been significantlyupdated. It now supports company/tag syntax as defined inPEP 514 using the-V:<company>/<tag> argument instead of the limited-<major>.<minor>.This allows launching distributions other thanPythonCore,the one hosted onpython.org.

When using-V: selectors, either company or tag can be omitted, but allinstalls will be searched. For example,-V:OtherPython/ will select the“best” tag registered forOtherPython, while-V:3.11 or-V:/3.11will select the “best” distribution with tag3.11.

When using the legacy-<major>,-<major>.<minor>,-<major>-<bitness> or-<major>.<minor>-<bitness> arguments,all existing behaviour should be preserved from past versions,and only releases fromPythonCore will be selected.However, the-64 suffix now implies “not 32-bit” (not necessarily x86-64),as there are multiple supported 64-bit platforms.32-bit runtimes are detected by checking the runtime’s tag for a-32 suffix.All releases of Python since 3.5 have included this in their 32-bit builds.

New Features Related to Type Hints

This section covers major changes affectingPEP 484 type hints andthetyping module.

PEP 646: Variadic generics

PEP 484 previously introducedTypeVar, enabling creationof generics parameterised with a single type.PEP 646 addsTypeVarTuple, enabling parameterisationwith anarbitrary number of types. In other words,aTypeVarTuple is avariadic type variable,enablingvariadic generics.

This enables a wide variety of use cases.In particular, it allows the type of array-like structuresin numerical computing libraries such as NumPy and TensorFlow to beparameterised with the arrayshape. Static type checkers will nowbe able to catch shape-related bugs in code that uses these libraries.

SeePEP 646 for more details.

(Contributed by Matthew Rahtz inbpo-43224, with contributions bySerhiy Storchaka and Jelle Zijlstra. PEP written by Mark Mendoza, MatthewRahtz, Pradeep Kumar Srinivasan, and Vincent Siles.)

PEP 655: Marking individualTypedDict items as required or not-required

Required andNotRequired provide astraightforward way to mark whether individual items in aTypedDict must be present. Previously, this was only possibleusing inheritance.

All fields are still required by default,unless thetotal parameter is set toFalse,in which case all fields are still not-required by default.For example, the following specifies aTypedDictwith one required and one not-required key:

classMovie(TypedDict):title:stryear:NotRequired[int]m1:Movie={"title":"Black Panther","year":2018}# OKm2:Movie={"title":"Star Wars"}# OK (year is not required)m3:Movie={"year":2022}# ERROR (missing required field title)

The following definition is equivalent:

classMovie(TypedDict,total=False):title:Required[str]year:int

SeePEP 655 for more details.

(Contributed by David Foster and Jelle Zijlstra inbpo-47087. PEPwritten by David Foster.)

PEP 673:Self type

The newSelf annotation provides a simple and intuitiveway to annotate methods that return an instance of their class. Thisbehaves the same as theTypeVar-based approachspecified in PEP 484,but is more concise and easier to follow.

Common use cases include alternative constructors provided asclassmethods,and__enter__() methods that returnself:

classMyLock:def__enter__(self)->Self:self.lock()returnself...classMyInt:@classmethoddeffromhex(cls,s:str)->Self:returncls(int(s,16))...

Self can also be used to annotate method parametersor attributes of the same type as their enclosing class.

SeePEP 673 for more details.

(Contributed by James Hilton-Balfe inbpo-46534. PEP written byPradeep Kumar Srinivasan and James Hilton-Balfe.)

PEP 675: Arbitrary literal string type

The newLiteralString annotation may be used to indicatethat a function parameter can be of any literal string type. This allowsa function to accept arbitrary literal string types, as well as stringscreated from other literal strings. Type checkers can thenenforce that sensitive functions, such as those that execute SQLstatements or shell commands, are called only with static arguments,providing protection against injection attacks.

For example, a SQL query function could be annotated as follows:

defrun_query(sql:LiteralString)->......defcaller(arbitrary_string:str,query_string:LiteralString,table_name:LiteralString,)->None:run_query("SELECT * FROM students")# okrun_query(query_string)# okrun_query("SELECT * FROM "+table_name)# okrun_query(arbitrary_string)# type checker errorrun_query(# type checker errorf"SELECT * FROM students WHERE name ={arbitrary_string}")

SeePEP 675 for more details.

(Contributed by Jelle Zijlstra inbpo-47088. PEP written by PradeepKumar Srinivasan and Graham Bleaney.)

PEP 681: Data class transforms

dataclass_transform may be used todecorate a class, metaclass, or a function that is itself a decorator.The presence of@dataclass_transform() tells a static type checker that thedecorated object performs runtime “magic” that transforms a class,giving itdataclass-like behaviors.

For example:

# The create_model decorator is defined by a library.@typing.dataclass_transform()defcreate_model(cls:Type[T])->Type[T]:cls.__init__=...cls.__eq__=...cls.__ne__=...returncls# The create_model decorator can now be used to create new model classes:@create_modelclassCustomerModel:id:intname:strc=CustomerModel(id=327,name="Eric Idle")

SeePEP 681 for more details.

(Contributed by Jelle Zijlstra ingh-91860. PEP written byErik De Bonte and Eric Traut.)

PEP 563 may not be the future

PEP 563 Postponed Evaluation of Annotations(thefrom__future__importannotationsfuture statement)that was originally planned for release in Python 3.10has been put on hold indefinitely.Seethis message from the Steering Councilfor more information.

Other Language Changes

  • Added a-P command line optionand aPYTHONSAFEPATH environment variable,which disable the automatic prepending tosys.pathof the script’s directory when running a script,or the current directory when using-c and-m.This ensures only stdlib and installed modulesare picked up byimport,and avoids unintentionally or maliciously shadowing moduleswith those in a local (and typically user-writable) directory.(Contributed by Victor Stinner ingh-57684.)

  • A"z" option was added to theFormat Specification Mini-Language thatcoerces negative to positive zero after rounding to the format precision.SeePEP 682 for more details.(Contributed by John Belmonte ingh-90153.)

  • Bytes are no longer accepted onsys.path. Support broke sometimebetween Python 3.2 and 3.6, with no one noticing until after Python 3.10.0was released. In addition, bringing back support would be problematic due tointeractions between-b andsys.path_importer_cache whenthere is a mixture ofstr andbytes keys.(Contributed by Thomas Grainger ingh-91181.)

Other CPython Implementation Changes

  • The special methods__complex__() forcomplexand__bytes__() forbytes are implemented to supportthetyping.SupportsComplex andtyping.SupportsBytes protocols.(Contributed by Mark Dickinson and Donghee Na inbpo-24234.)

  • siphash13 is added as a new internal hashing algorithm.It has similar security properties assiphash24,but it is slightly faster for long inputs.str,bytes, and some other typesnow use it as the default algorithm forhash().PEP 552hash-based .pyc filesnow usesiphash13 too.(Contributed by Inada Naoki inbpo-29410.)

  • When an active exception is re-raised by araise statement with no parameters,the traceback attached to this exception is now alwayssys.exc_info()[1].__traceback__.This means that changes made to the traceback in the currentexcept clause arereflected in the re-raised exception.(Contributed by Irit Katriel inbpo-45711.)

  • The interpreter state’s representation of handled exceptions(akaexc_info or_PyErr_StackItem)now only has theexc_value field;exc_type andexc_tracebackhave been removed, as they can be derived fromexc_value.(Contributed by Irit Katriel inbpo-45711.)

  • A newcommand line option,AppendPath,has been added for the Windows installer.It behaves similarly toPrependPath,but appends the install and scripts directories instead of prepending them.(Contributed by Bastian Neuburger inbpo-44934.)

  • ThePyConfig.module_search_paths_set field must now be set to1 forinitialization to usePyConfig.module_search_paths to initializesys.path. Otherwise, initialization will recalculate the path and replaceany values added tomodule_search_paths.

  • The output of the--help option now fits in 50 lines/80 columns.Information aboutPython environment variablesand-X options is now available using the respective--help-env and--help-xoptions flags,and with the new--help-all.(Contributed by Éric Araujo inbpo-46142.)

  • Converting betweenint andstr in bases other than 2(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)now raises aValueError if the number of digits in string form isabove a limit to avoid potential denial of service attacks due to thealgorithmic complexity. This is a mitigation forCVE 2020-10735.This limit can be configured or disabled by environment variable, commandline flag, orsys APIs. See theinteger string conversionlength limitation documentation. The default limitis 4300 digits in string form.

New Modules

Improved Modules

asyncio

contextlib

  • Added non parallel-safechdir() context manager to changethe current working directory and then restore it on exit. Simple wrapperaroundchdir(). (Contributed by Filipe Laíns inbpo-25625)

dataclasses

  • Change field default mutability check, allowing only defaults which arehashable instead of any object which is not an instance ofdict,list orset. (Contributed by Eric V. Smith inbpo-44674.)

datetime

enum

  • RenamedEnumMeta toEnumType(EnumMeta kept as an alias).

  • AddedStrEnum,with members that can be used as (and must be) strings.

  • AddedReprEnum,which only modifies the__repr__() of memberswhile returning their literal values (rather than names)for__str__() and__format__()(used bystr(),format() andf-strings).

  • ChangedEnum.__format__() (the default forformat(),str.format() andf-strings) to always producethe same result asEnum.__str__(): for enums inheriting fromReprEnum it will be the member’s value; for all other enumsit will be the enum and member name (e.g.Color.RED).

  • Added a newboundary class parameter toFlag enumsand theFlagBoundary enum with its options,to control how to handle out-of-range flag values.

  • Added theverify() enum decoratorand theEnumCheck enum with its options,to check enum classes against several specific constraints.

  • Added themember() andnonmember() decorators,to ensure the decorated object is/is not converted to an enum member.

  • Added theproperty() decorator,which works likeproperty() except for enums.Use this instead oftypes.DynamicClassAttribute().

  • Added theglobal_enum() enum decorator,which adjusts__repr__() and__str__()to show values as members of their module rather than the enum class.For example,'re.ASCII' for theASCII memberofre.RegexFlag rather than'RegexFlag.ASCII'.

  • EnhancedFlag to supportlen(), iteration andin/notin on its members.For example, the following now works:len(AFlag(3))==2andlist(AFlag(3))==(AFlag.ONE,AFlag.TWO)

  • ChangedEnum andFlagso that members are now definedbefore__init_subclass__() is called;dir() now includes methods, etc., from mixed-in data types.

  • ChangedFlagto only consider primary values (power of two) canonicalwhile composite values (3,6,10, etc.) are considered aliases;inverted flags are coerced to their positive equivalent.

fcntl

  • On FreeBSD, theF_DUP2FD andF_DUP2FD_CLOEXEC flags respectivelyare supported, the former equals todup2 usage while the latter settheFD_CLOEXEC flag in addition.

fractions

  • SupportPEP 515-style initialization ofFraction fromstring. (Contributed by Sergey B Kirpichev inbpo-44258.)

  • Fraction now implements an__int__ method, sothat anisinstance(some_fraction,typing.SupportsInt) check passes.(Contributed by Mark Dickinson inbpo-44547.)

functools

  • functools.singledispatch() now supportstypes.UnionTypeandtyping.Union as annotations to the dispatch argument.:

    >>>fromfunctoolsimportsingledispatch>>>@singledispatch...deffun(arg,verbose=False):...ifverbose:...print("Let me just say,",end=" ")...print(arg)...>>>@fun.register...def_(arg:int|float,verbose=False):...ifverbose:...print("Strength in numbers, eh?",end=" ")...print(arg)...>>>fromtypingimportUnion>>>@fun.register...def_(arg:Union[list,set],verbose=False):...ifverbose:...print("Enumerate this:")...fori,eleminenumerate(arg):...print(i,elem)...

    (Contributed by Yurii Karabas inbpo-46014.)

gzip

  • Thegzip.compress() function is now faster when used with themtime=0 argument as it delegates the compression entirely to a singlezlib.compress() operation. There is one side effect of this change: Thegzip file header contains an “OS” byte in its header. That was traditionallyalways set to a value of 255 representing “unknown” by thegzipmodule. Now, when usingcompress() withmtime=0, it may beset to a different value by the underlying zlib C library Python was linkedagainst.(Seegh-112346 for details on the side effect.)

hashlib

  • hashlib.blake2b() andhashlib.blake2s() now preferlibb2over Python’s vendored copy.(Contributed by Christian Heimes inbpo-47095.)

  • The internal_sha3 module with SHA3 and SHAKE algorithms now usestiny_sha3 instead of theKeccak Code Package to reduce code and binarysize. Thehashlib module prefers optimized SHA3 and SHAKEimplementations from OpenSSL. The change affects only installations withoutOpenSSL support.(Contributed by Christian Heimes inbpo-47098.)

  • Addhashlib.file_digest(), a helper function for efficient hashingof files or file-like objects.(Contributed by Christian Heimes ingh-89313.)

IDLE and idlelib

  • Apply syntax highlighting to.pyi files. (Contributed by AlexWaygood and Terry Jan Reedy inbpo-45447.)

  • Include prompts when saving Shell with inputs and outputs.(Contributed by Terry Jan Reedy ingh-95191.)

inspect

locale

logging

math

  • Addmath.exp2(): return 2 raised to the power of x.(Contributed by Gideon Mitchell inbpo-45917.)

  • Addmath.cbrt(): return the cube root of x.(Contributed by Ajith Ramachandran inbpo-44357.)

  • The behaviour of twomath.pow() corner cases was changed, forconsistency with the IEEE 754 specification. The operationsmath.pow(0.0,-math.inf) andmath.pow(-0.0,-math.inf) now returninf. Previously they raisedValueError. (Contributed by MarkDickinson inbpo-44339.)

  • Themath.nan value is now always available.(Contributed by Victor Stinner inbpo-46917.)

operator

  • A new functionoperator.call has been added, such thatoperator.call(obj,*args,**kwargs)==obj(*args,**kwargs).(Contributed by Antony Lee inbpo-44019.)

os

  • On Windows,os.urandom() now usesBCryptGenRandom(),instead ofCryptGenRandom() which is deprecated.(Contributed by Donghee Na inbpo-44611.)

pathlib

re

  • Atomic grouping ((?>...)) and possessive quantifiers (*+,++,?+,{m,n}+) are now supported in regular expressions.(Contributed by Jeffrey C. Jacobs and Serhiy Storchaka inbpo-433030.)

shutil

socket

  • Add CAN Socket support for NetBSD.(Contributed by Thomas Klausner inbpo-30512.)

  • create_connection() has an option to raise, in case offailure to connect, anExceptionGroup containing all errorsinstead of only raising the last error.(Contributed by Irit Katriel inbpo-29980.)

sqlite3

string

sys

  • sys.exc_info() now derives thetype andtraceback fieldsfrom thevalue (the exception instance), so when an exception ismodified while it is being handled, the changes are reflected inthe results of subsequent calls toexc_info().(Contributed by Irit Katriel inbpo-45711.)

  • Addsys.exception() which returns the active exception instance(equivalent tosys.exc_info()[1]).(Contributed by Irit Katriel inbpo-46328.)

  • Add thesys.flags.safe_path flag.(Contributed by Victor Stinner ingh-57684.)

sysconfig

  • Three newinstallation schemes(posix_venv,nt_venv andvenv) were added and are used when Pythoncreates new virtual environments or when it is running from a virtualenvironment.The first two schemes (posix_venv andnt_venv) are OS-specificfor non-Windows and Windows, thevenv is essentially an alias to one ofthem according to the OS Python runs on.This is useful for downstream distributors who modifysysconfig.get_preferred_scheme().Third party code that creates new virtual environments should use the newvenv installation scheme to determine the paths, as doesvenv.(Contributed by Miro Hrončok inbpo-45413.)

tempfile

threading

time

  • On Unix,time.sleep() now uses theclock_nanosleep() ornanosleep() function, if available, which has a resolution of 1 nanosecond(10-9 seconds), rather than usingselect() which has a resolutionof 1 microsecond (10-6 seconds).(Contributed by Benjamin Szőke and Victor Stinner inbpo-21302.)

  • On Windows 8.1 and newer,time.sleep() now uses a waitable timer basedonhigh-resolution timerswhich has a resolution of 100 nanoseconds (10-7 seconds). Previously,it had a resolution of 1 millisecond (10-3 seconds).(Contributed by Benjamin Szőke, Donghee Na, Eryk Sun and Victor Stinner inbpo-21302 andbpo-45429.)

tkinter

  • Added methodinfo_patchlevel() which returns the exact version ofthe Tcl library as a named tuple similar tosys.version_info.(Contributed by Serhiy Storchaka ingh-91827.)

traceback

typing

For major changes, seeNew Features Related to Type Hints.

  • Addtyping.assert_never() andtyping.Never.typing.assert_never() is useful for asking a type checker to confirmthat a line of code is not reachable. At runtime, it raises anAssertionError.(Contributed by Jelle Zijlstra ingh-90633.)

  • Addtyping.reveal_type(). This is useful for asking a type checkerwhat type it has inferred for a given expression. At runtime it printsthe type of the received value.(Contributed by Jelle Zijlstra ingh-90572.)

  • Addtyping.assert_type(). This is useful for asking a type checkerto confirm that the type it has inferred for a given expression matchesthe given type. At runtime it simply returns the received value.(Contributed by Jelle Zijlstra ingh-90638.)

  • typing.TypedDict types can now be generic. (Contributed bySamodya Abeysiriwardane ingh-89026.)

  • NamedTuple types can now be generic.(Contributed by Serhiy Storchaka inbpo-43923.)

  • Allow subclassing oftyping.Any. This is useful for avoidingtype checker errors related to highly dynamic class, such as mocks.(Contributed by Shantanu Jain ingh-91154.)

  • Thetyping.final() decorator now sets the__final__ attributed onthe decorated object.(Contributed by Jelle Zijlstra ingh-90500.)

  • Thetyping.get_overloads() function can be used for introspectingthe overloads of a function.typing.clear_overloads() can be usedto clear all registered overloads of a function.(Contributed by Jelle Zijlstra ingh-89263.)

  • The__init__() method ofProtocol subclassesis now preserved. (Contributed by Adrian Garcia Badarasco ingh-88970.)

  • The representation of empty tuple types (Tuple[()]) is simplified.This affects introspection, e.g.get_args(Tuple[()]) now evaluatesto() instead of((),).(Contributed by Serhiy Storchaka ingh-91137.)

  • Loosen runtime requirements for type annotations by removing the callablecheck in the privatetyping._type_check function. (Contributed byGregory Beauregard ingh-90802.)

  • typing.get_type_hints() now supports evaluating strings as forwardreferences inPEP 585 generic aliases.(Contributed by Niklas Rosenstein ingh-85542.)

  • typing.get_type_hints() no longer addsOptionalto parameters withNone as a default. (Contributed by Nikita Sobolevingh-90353.)

  • typing.get_type_hints() now supports evaluating bare stringifiedClassVar annotations. (Contributed by Gregory Beauregardingh-90711.)

  • typing.no_type_check() no longer modifies external classes and functions.It also now correctly marks classmethods as not to be type checked. (Contributedby Nikita Sobolev ingh-90729.)

unicodedata

  • The Unicode database has been updated to version 14.0.0.(Contributed by Benjamin Peterson inbpo-45190).

unittest

venv

  • When new Python virtual environments are created, thevenvsysconfig installation scheme is usedto determine the paths inside the environment.When Python runs in a virtual environment, the same installation schemeis the default.That means that downstream distributors can change the default sysconfig installscheme without changing behavior of virtual environments.Third party code that also creates new virtual environments should do the same.(Contributed by Miro Hrončok inbpo-45413.)

warnings

zipfile

Optimizations

This section covers specific optimizations independent of theFaster CPython project, which is covered in its own section.

  • The compiler now optimizes simpleprintf-style % formatting on string literalscontaining only the format codes%s,%r and%a and makes it asfast as a correspondingf-string expression.(Contributed by Serhiy Storchaka inbpo-28307.)

  • Integer division (//) is better tuned for optimization by compilers.It is now around 20% faster on x86-64 when dividing anintby a value smaller than2**30.(Contributed by Gregory P. Smith and Tim Peters ingh-90564.)

  • sum() is now nearly 30% faster for integers smaller than2**30.(Contributed by Stefan Behnel ingh-68264.)

  • Resizing lists is streamlined for the common case,speeding uplist.append() by ≈15%and simplelist comprehensions by up to 20-30%(Contributed by Dennis Sweeney ingh-91165.)

  • Dictionaries don’t store hash values when all keys are Unicode objects,decreasingdict size.For example,sys.getsizeof(dict.fromkeys("abcdefg"))is reduced from 352 bytes to 272 bytes (23% smaller) on 64-bit platforms.(Contributed by Inada Naoki inbpo-46845.)

  • Usingasyncio.DatagramProtocol is now orders of magnitude fasterwhen transferring large files over UDP,with speeds over 100 times higher for a ≈60 MiB file.(Contributed by msoxzw ingh-91487.)

  • math functionscomb() andperm() are now≈10 times faster for large arguments (with a larger speedup for largerk).(Contributed by Serhiy Storchaka inbpo-37295.)

  • Thestatistics functionsmean(),variance() andstdev() now consumeiterators in one pass rather than converting them to alist first.This is twice as fast and can save substantial memory.(Contributed by Raymond Hettinger ingh-90415.)

  • unicodedata.normalize()now normalizes pure-ASCII strings in constant time.(Contributed by Donghee Na inbpo-44987.)

Faster CPython

CPython 3.11 is an average of25% fasterthan CPython 3.10 as measured with thepyperformance benchmark suite,when compiled with GCC on Ubuntu Linux.Depending on your workload, the overall speedup could be 10-60%.

This project focuses on two major areas in Python:Faster Startup andFaster Runtime.Optimizations not covered by this project are listed separately underOptimizations.

Faster Startup

Frozen imports / Static code objects

Python cachesbytecode in the__pycache__directory to speed up module loading.

Previously in 3.10, Python module execution looked like this:

Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate

In Python 3.11, the core modules essential for Python startup are “frozen”.This means that theirCode Objects (and bytecode)are statically allocated by the interpreter.This reduces the steps in module execution process to:

Statically allocated code object -> Evaluate

Interpreter startup is now 10-15% faster in Python 3.11. This has a bigimpact for short-running programs using Python.

(Contributed by Eric Snow, Guido van Rossum and Kumar Aditya in many issues.)

Faster Runtime

Cheaper, lazy Python frames

Python frames, holding execution information,are created whenever Python calls a Python function.The following are new frame optimizations:

  • Streamlined the frame creation process.

  • Avoided memory allocation by generously re-using frame space on the C stack.

  • Streamlined the internal frame struct to contain only essential information.Frames previously held extra debugging and memory management information.

Old-styleframe objectsare now created only when requested by debuggersor by Python introspection functions such assys._getframe() andinspect.currentframe(). For most user code, no frame objects arecreated at all. As a result, nearly all Python functions calls have spedup significantly. We measured a 3-7% speedup in pyperformance.

(Contributed by Mark Shannon inbpo-44590.)

Inlined Python function calls

During a Python function call, Python will call an evaluating C function tointerpret that function’s code. This effectively limits pure Python recursion towhat’s safe for the C stack.

In 3.11, when CPython detects Python code calling another Python function,it sets up a new frame, and “jumps” to the new code inside the new frame. Thisavoids calling the C interpreting function altogether.

Most Python function calls now consume no C stack space, speeding them up.In simple recursive functions like fibonacci orfactorial, we observed a 1.7x speedup. This also means recursive functionscan recurse significantly deeper(if the user increases the recursion limit withsys.setrecursionlimit()).We measured a 1-3% improvement in pyperformance.

(Contributed by Pablo Galindo and Mark Shannon inbpo-45256.)

PEP 659: Specializing Adaptive Interpreter

PEP 659 is one of the key parts of the Faster CPython project. The generalidea is that while Python is a dynamic language, most code has regions whereobjects and types rarely change. This concept is known astype stability.

At runtime, Python will try to look for common patterns and type stabilityin the executing code. Python will then replace the current operation with amore specialized one. This specialized operation uses fast paths available onlyto those use cases/types, which generally outperform their genericcounterparts. This also brings in another concept calledinline caching, wherePython caches the results of expensive operations directly in thebytecode.

The specializer will also combine certain common instruction pairs into onesuperinstruction, reducing the overhead during execution.

Python will only specializewhen it sees code that is “hot” (executed multiple times). This prevents Pythonfrom wasting time on run-once code. Python can also de-specialize when code istoo dynamic or when the use changes. Specialization is attempted periodically,and specialization attempts are not too expensive,allowing specialization to adapt to new circumstances.

(PEP written by Mark Shannon, with ideas inspired by Stefan Brunthaler.SeePEP 659 for more information. Implementation by Mark Shannon and BrandtBucher, with additional help from Irit Katriel and Dennis Sweeney.)

Operation

Form

Specialization

Operation speedup(up to)

Contributor(s)

Binaryoperations

x+x

x-x

x*x

Binary add, multiply and subtract for common typessuch asint,float andstrtake custom fast paths for their underlying types.

10%

Mark Shannon,Donghee Na,Brandt Bucher,Dennis Sweeney

Subscript

a[i]

Subscripting container types such aslist,tuple anddict directly indexthe underlying data structures.

Subscripting custom__getitem__()is also inlined similar toInlined Python function calls.

10-25%

Irit Katriel,Mark Shannon

Storesubscript

a[i]=z

Similar to subscripting specialization above.

10-25%

Dennis Sweeney

Calls

f(arg)

C(arg)

Calls to common builtin (C) functions and types suchaslen() andstr directly call theirunderlying C version. This avoids going through theinternal calling convention.

20%

Mark Shannon,Ken Jin

Loadglobalvariable

print

len

The object’s index in the globals/builtins namespaceis cached. Loading globals and builtins requirezero namespace lookups.

[1]

Mark Shannon

Loadattribute

o.attr

Similar to loading global variables. The attribute’sindex inside the class/object’s namespace is cached.In most cases, attribute loading will require zeronamespace lookups.

[2]

Mark Shannon

Loadmethods forcall

o.meth()

The actual address of the method is cached. Methodloading now has no namespace lookups – even forclasses with long inheritance chains.

10-20%

Ken Jin,Mark Shannon

Storeattribute

o.attr=z

Similar to load attribute optimization.

2%in pyperformance

Mark Shannon

UnpackSequence

*seq

Specialized for common containers such aslist andtuple.Avoids internal calling convention.

8%

Brandt Bucher

[1]

A similar optimization already existed since Python 3.8.3.11 specializes for more forms and reduces some overhead.

[2]

A similar optimization already existed since Python 3.10.3.11 specializes for more forms. Furthermore, all attribute loads shouldbe sped up bybpo-45947.

Misc

  • Objects now require less memory due to lazily created object namespaces.Their namespace dictionaries now also share keys more freely.(Contributed Mark Shannon inbpo-45340 andbpo-40116.)

  • “Zero-cost” exceptions are implemented, eliminating the costoftry statements when no exception is raised.(Contributed by Mark Shannon inbpo-40222.)

  • A more concise representation of exceptions in the interpreter reduced thetime required for catching an exception by about 10%.(Contributed by Irit Katriel inbpo-45711.)

  • re’s regular expression matching engine has been partially refactored,and now uses computed gotos (or “threaded code”) on supported platforms. As aresult, Python 3.11 executes thepyperformance regular expression benchmarks up to 10%faster than Python 3.10.(Contributed by Brandt Bucher ingh-91404.)

FAQ

How should I write my code to utilize these speedups?

Write Pythonic code that follows common best practices;you don’t have to change your code.The Faster CPython project optimizes for common code patterns we observe.

Will CPython 3.11 use more memory?

Maybe not; we don’t expect memory use to exceed 20% higher than 3.10.This is offset by memory optimizations for frame objects and objectdictionaries as mentioned above.

I don’t see any speedups in my workload. Why?

Certain code won’t have noticeable benefits. If your code spends most ofits time on I/O operations, or already does most of itscomputation in a C extension library like NumPy, there won’t be significantspeedups. This project currently benefits pure-Python workloads the most.

Furthermore, the pyperformance figures are a geometric mean. Even within thepyperformance benchmarks, certain benchmarks have slowed down slightly, whileothers have sped up by nearly 2x!

Is there a JIT compiler?

No. We’re still exploring other optimizations.

About

Faster CPython explores optimizations forCPython. The main team isfunded by Microsoft to work on this full-time. Pablo Galindo Salgado is alsofunded by Bloomberg LP to work on the project part-time. Finally, manycontributors are volunteers from the community.

CPython bytecode changes

The bytecode now contains inline cache entries,which take the form of the newly-addedCACHE instructions.Many opcodes expect to be followed by an exact number of caches,and instruct the interpreter to skip over them at runtime.Populated caches can look like arbitrary instructions,so great care should be taken when reading or modifyingraw, adaptive bytecode containing quickened data.

New opcodes

Replaced opcodes

Replaced Opcode(s)

New Opcode(s)

Notes

BINARY_*
INPLACE_*

BINARY_OP

Replaced all numeric binary/in-placeopcodes with a single opcode

CALL_FUNCTION
CALL_FUNCTION_KW
CALL_METHOD
KW_NAMES
PRECALL

Decouples argument shifting for methodsfrom handling of keyword arguments;allows better specialization of calls

DUP_TOP
DUP_TOP_TWO
ROT_TWO
ROT_THREE
ROT_FOUR
ROT_N

Stack manipulation instructions

JUMP_IF_NOT_EXC_MATCH

Now performs check but doesn’t jump

JUMP_ABSOLUTE
POP_JUMP_IF_FALSE
POP_JUMP_IF_TRUE
POP_JUMP_BACKWARD_IF_*
POP_JUMP_FORWARD_IF_*

See[3];TRUE,FALSE,NONE andNOT_NONE variantsfor each direction

SETUP_WITH
SETUP_ASYNC_WITH

BEFORE_WITH

with block setup

[3]

All jump opcodes are now relative, including theexistingJUMP_IF_TRUE_OR_POP andJUMP_IF_FALSE_OR_POP.The argument is now an offset from the current instructionrather than an absolute location.

Changed/removed opcodes

  • ChangedMATCH_CLASS andMATCH_KEYSto no longer push an additional boolean value to indicate success/failure.Instead,None is pushed on failurein place of the tuple of extracted values.

  • Changed opcodes that work with exceptions to reflect themnow being represented as one item on the stack instead of three(seegh-89874).

  • RemovedCOPY_DICT_WITHOUT_KEYS,GEN_START,POP_BLOCK,SETUP_FINALLY andYIELD_FROM.

Deprecated

This section lists Python APIs that have been deprecated in Python 3.11.

Deprecated C APIs arelisted separately.

Language/Builtins

  • Chainingclassmethod descriptors (introduced inbpo-19072)is now deprecated. It can no longer be used to wrap other descriptorssuch asproperty. The core design of this feature was flawedand caused a number of downstream problems. To “pass-through” aclassmethod, consider using the__wrapped__ attributethat was added in Python 3.10.(Contributed by Raymond Hettinger ingh-89519.)

  • Octal escapes in string and bytes literals with values larger than0o377(255 in decimal) now produce aDeprecationWarning.In a future Python version, they will raise aSyntaxWarning andeventually aSyntaxError.(Contributed by Serhiy Storchaka ingh-81548.)

  • The delegation ofint() to__trunc__() is now deprecated.Callingint(a) whentype(a) implements__trunc__() but not__int__() or__index__() now raisesaDeprecationWarning.(Contributed by Zackery Spytz inbpo-44977.)

Modules

  • PEP 594 led to the deprecations of the following modulesslated for removal in Python 3.13:

    aifc

    chunk

    msilib

    pipes

    telnetlib

    audioop

    crypt

    nis

    sndhdr

    uu

    cgi

    imghdr

    nntplib

    spwd

    xdrlib

    cgitb

    mailcap

    ossaudiodev

    sunau

    (Contributed by Brett Cannon inbpo-47061 and Victor Stinner ingh-68966.)

  • Theasynchat,asyncore andsmtpd modules have beendeprecated since at least Python 3.6. Their documentation and deprecationwarnings have now been updated to note they will be removed in Python 3.12.(Contributed by Hugo van Kemenade inbpo-47022.)

  • Thelib2to3 package and2to3 toolare now deprecated and may not be able to parse Python 3.10 or newer.SeePEP 617, introducing the new PEG parser, for details.(Contributed by Victor Stinner inbpo-40360.)

  • Undocumented modulessre_compile,sre_constantsandsre_parse are now deprecated.(Contributed by Serhiy Storchaka inbpo-47152.)

Standard Library

  • The following have been deprecated inconfigparser since Python 3.2.Their deprecation warnings have now been updated to note they will be removedin Python 3.12:

    • theconfigparser.SafeConfigParser class

    • theconfigparser.ParsingError.filename property

    • theconfigparser.RawConfigParser.readfp() method

    (Contributed by Hugo van Kemenade inbpo-45173.)

  • configparser.LegacyInterpolation has been deprecated in the docstringsince Python 3.2, and is not listed in theconfigparser documentation.It now emits aDeprecationWarning and will be removedin Python 3.13. Useconfigparser.BasicInterpolation orconfigparser.ExtendedInterpolation instead.(Contributed by Hugo van Kemenade inbpo-46607.)

  • The older set ofimportlib.resources functions were deprecatedin favor of the replacements added in Python 3.9and will be removed in a future Python version,due to not supporting resources located within package subdirectories:

    • importlib.resources.contents()

    • importlib.resources.is_resource()

    • importlib.resources.open_binary()

    • importlib.resources.open_text()

    • importlib.resources.read_binary()

    • importlib.resources.read_text()

    • importlib.resources.path()

  • Thelocale.getdefaultlocale() function is deprecated and will beremoved in Python 3.15. Uselocale.setlocale(),locale.getpreferredencoding(False) andlocale.getlocale() functions instead.(Contributed by Victor Stinner ingh-90817.)

  • Thelocale.resetlocale() function is deprecated and will beremoved in Python 3.13. Uselocale.setlocale(locale.LC_ALL,"") instead.(Contributed by Victor Stinner ingh-90817.)

  • Stricter rules will now be applied for numerical group referencesand group names inregular expressions.Only sequences of ASCII digits will now be accepted as a numerical reference,and the group name inbytes patterns and replacement stringscan only contain ASCII letters, digits and underscores.For now, a deprecation warning is raised for syntax violating these rules.(Contributed by Serhiy Storchaka ingh-91760.)

  • In there module, there.template() functionand the correspondingre.TEMPLATE andre.T flagsare deprecated, as they were undocumented and lacked an obvious purpose.They will be removed in Python 3.13.(Contributed by Serhiy Storchaka and Miro Hrončok ingh-92728.)

  • turtle.settiltangle() has been deprecated since Python 3.1;it now emits a deprecation warning and will be removed in Python 3.13. Useturtle.tiltangle() instead (it was earlier incorrectly markedas deprecated, and its docstring is now corrected).(Contributed by Hugo van Kemenade inbpo-45837.)

  • typing.Text, which exists solely to provide compatibility supportbetween Python 2 and Python 3 code, is now deprecated. Its removal iscurrently unplanned, but users are encouraged to usestr insteadwherever possible.(Contributed by Alex Waygood ingh-92332.)

  • The keyword argument syntax for constructingtyping.TypedDict typesis now deprecated. Support will be removed in Python 3.13. (Contributed byJingchen Ye ingh-90224.)

  • webbrowser.MacOSX is deprecated and will be removed in Python 3.13.It is untested, undocumented, and not used bywebbrowser itself.(Contributed by Donghee Na inbpo-42255.)

  • The behavior of returning a value from aTestCase andIsolatedAsyncioTestCase test methods (other than thedefaultNone value) is now deprecated.

  • Deprecated the following not-formally-documentedunittest functions,scheduled for removal in Python 3.13:

    • unittest.findTestCases()

    • unittest.makeSuite()

    • unittest.getTestCaseNames()

    UseTestLoader methods instead:

    (Contributed by Erlend E. Aasland inbpo-5846.)

  • unittest.TestProgram.usageExit() is marked deprecated, to be removedin 3.13.(Contributed by Carlos Damázio ingh-67048.)

Pending Removal in Python 3.12

The following Python APIs have been deprecated in earlier Python releases,and will be removed in Python 3.12.

C APIs pending removal arelisted separately.

  • Theasynchat module

  • Theasyncore module

  • Theentire distutils package

  • Theimp module

  • Thetyping.io namespace

  • Thetyping.re namespace

  • cgi.log()

  • importlib.find_loader()

  • importlib.abc.Loader.module_repr()

  • importlib.abc.MetaPathFinder.find_module()

  • importlib.abc.PathEntryFinder.find_loader()

  • importlib.abc.PathEntryFinder.find_module()

  • importlib.machinery.BuiltinImporter.find_module()

  • importlib.machinery.BuiltinLoader.module_repr()

  • importlib.machinery.FileFinder.find_loader()

  • importlib.machinery.FileFinder.find_module()

  • importlib.machinery.FrozenImporter.find_module()

  • importlib.machinery.FrozenLoader.module_repr()

  • importlib.machinery.PathFinder.find_module()

  • importlib.machinery.WindowsRegistryFinder.find_module()

  • importlib.util.module_for_loader()

  • importlib.util.set_loader_wrapper()

  • importlib.util.set_package_wrapper()

  • pkgutil.ImpImporter

  • pkgutil.ImpLoader

  • pathlib.Path.link_to()

  • sqlite3.enable_shared_cache()

  • sqlite3.OptimizedUnicode()

  • PYTHONTHREADDEBUG environment variable

  • The following deprecated aliases inunittest:

    Deprecated alias

    Method Name

    Deprecated in

    failUnless

    assertTrue()

    3.1

    failIf

    assertFalse()

    3.1

    failUnlessEqual

    assertEqual()

    3.1

    failIfEqual

    assertNotEqual()

    3.1

    failUnlessAlmostEqual

    assertAlmostEqual()

    3.1

    failIfAlmostEqual

    assertNotAlmostEqual()

    3.1

    failUnlessRaises

    assertRaises()

    3.1

    assert_

    assertTrue()

    3.2

    assertEquals

    assertEqual()

    3.2

    assertNotEquals

    assertNotEqual()

    3.2

    assertAlmostEquals

    assertAlmostEqual()

    3.2

    assertNotAlmostEquals

    assertNotAlmostEqual()

    3.2

    assertRegexpMatches

    assertRegex()

    3.2

    assertRaisesRegexp

    assertRaisesRegex()

    3.2

    assertNotRegexpMatches

    assertNotRegex()

    3.5

Removed

This section lists Python APIs that have been removed in Python 3.11.

Removed C APIs arelisted separately.

  • Removed the@asyncio.coroutine()decoratorenabling legacy generator-based coroutines to be compatible withasync /await code.The function has been deprecated since Python 3.8 and the removal wasinitially scheduled for Python 3.10. Useasyncdef instead.(Contributed by Illia Volochii inbpo-43216.)

  • Removedasyncio.coroutines.CoroWrapper used for wrapping legacygenerator-based coroutine objects in the debug mode.(Contributed by Illia Volochii inbpo-43216.)

  • Due to significant security concerns, thereuse_address parameter ofasyncio.loop.create_datagram_endpoint(), disabled in Python 3.9, isnow entirely removed. This is because of the behavior of the socket optionSO_REUSEADDR in UDP.(Contributed by Hugo van Kemenade inbpo-45129.)

  • Removed thebinhex module, deprecated in Python 3.9.Also removed the related, similarly-deprecatedbinascii functions:

    • binascii.a2b_hqx()

    • binascii.b2a_hqx()

    • binascii.rlecode_hqx()

    • binascii.rldecode_hqx()

    Thebinascii.crc_hqx() function remains available.

    (Contributed by Victor Stinner inbpo-45085.)

  • Removed thedistutilsbdist_msi command deprecated in Python 3.9.Usebdist_wheel (wheel packages) instead.(Contributed by Hugo van Kemenade inbpo-45124.)

  • Removed the__getitem__() methods ofxml.dom.pulldom.DOMEventStream,wsgiref.util.FileWrapperandfileinput.FileInput, deprecated since Python 3.9.(Contributed by Hugo van Kemenade inbpo-45132.)

  • Removed the deprecatedgettext functionslgettext(),ldgettext(),lngettext() andldngettext().Also removed thebind_textdomain_codeset() function,theNullTranslations.output_charset() andNullTranslations.set_output_charset() methods,and thecodeset parameter oftranslation() andinstall(),since they are only used for thel*gettext() functions.(Contributed by Donghee Na and Serhiy Storchaka inbpo-44235.)

  • Removed from theinspect module:

    (Contributed by Hugo van Kemenade inbpo-45320.)

  • Removed the__class_getitem__() methodfrompathlib.PurePath,because it was not used and added by mistake in previous versions.(Contributed by Nikita Sobolev inbpo-46483.)

  • Removed theMailmanProxy class in thesmtpd module,as it is unusable without the externalmailman package.(Contributed by Donghee Na inbpo-35800.)

  • Removed the deprecatedsplit() method of_tkinter.TkappType.(Contributed by Erlend E. Aasland inbpo-38371.)

  • Removed namespace package support fromunittest discovery.It was introduced in Python 3.4 but has been broken since Python 3.7.(Contributed by Inada Naoki inbpo-23882.)

  • Removed the undocumented privatefloat.__set_format__() method,previously known asfloat.__setformat__() in Python 3.7.Its docstring said: “You probably don’t want to use this function.It exists mainly to be used in Python’s test suite.”(Contributed by Victor Stinner inbpo-46852.)

  • The--experimental-isolated-subinterpreters configure flag(and correspondingEXPERIMENTAL_ISOLATED_SUBINTERPRETERS macro)have been removed.

  • Pynche— The Pythonically Natural Color and Hue Editor — has been moved outofTools/scripts and isbeing developed independently from the Python source tree.

Porting to Python 3.11

This section lists previously described changes and other bugfixesin the Python API that may require changes to your Python code.

Porting notes for the C API arelisted separately.

Build Changes

  • CPython now hasPEP 11Tier 3 support forcross compiling to theWebAssembly platformsEmscripten(wasm32-unknown-emscripten, i.e. Python in the browser)andWebAssembly System Interface (WASI)(wasm32-unknown-wasi).The effort is inspired by previous work likePyodide.These platforms provide a limited subset of POSIX APIs; Python standardlibraries features and modules related to networking, processes, threading,signals, mmap, and users/groups are not available or don’t work.(Emscripten contributed by Christian Heimes and Ethan Smith ingh-84461and WASI contributed by Christian Heimes ingh-90473;platforms promoted ingh-95085)

  • Building CPython now requires:

  • ThePy_NO_NAN macro has been removed.Since CPython now requires IEEE 754 floats, NaN values are always available.(Contributed by Victor Stinner inbpo-46656.)

  • Thetkinter package now requiresTcl/Tkversion 8.5.12 or newer.(Contributed by Serhiy Storchaka inbpo-46996.)

  • Build dependencies, compiler flags, and linker flags for most stdlibextension modules are now detected byconfigure. libffi, libnsl,libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk, and uuid flagsare detected bypkg-config (when available).tkinter now requires a pkg-config commandto detect development settings forTcl/Tk headers and libraries.(Contributed by Christian Heimes and Erlend Egeberg Aasland inbpo-45847,bpo-45747, andbpo-45763.)

  • libpython is no longer linked against libcrypt.(Contributed by Mike Gilbert inbpo-45433.)

  • CPython can now be built with theThinLTO optionvia passingthin to--with-lto, i.e.--with-lto=thin.(Contributed by Donghee Na and Brett Holman inbpo-44340.)

  • Freelists for object structs can now be disabled. A newconfigureoption--without-freelists can be used to disable all freelistsexcept empty tuple singleton.(Contributed by Christian Heimes inbpo-45522.)

  • Modules/Setup andModules/makesetup have been improved and tied up.Extension modules can now be built throughmakesetup. All except sometest modules can be linked statically into a main binary or library.(Contributed by Brett Cannon and Christian Heimes inbpo-45548,bpo-45570,bpo-45571, andbpo-43974.)

    Note

    Use the environment variablesTCLTK_CFLAGS andTCLTK_LIBS to manually specify the location of Tcl/Tk headersand libraries. Theconfigure options--with-tcltk-includes and--with-tcltk-libshave been removed.

    On RHEL 7 and CentOS 7 the development packages do not providetcl.pcandtk.pc; useTCLTK_LIBS="-ltk8.5-ltkstub8.5-ltcl8.5".The directoryMisc/rhel7 contains.pc files and instructionson how to build Python with RHEL 7’s and CentOS 7’s Tcl/Tk and OpenSSL.

  • CPython will now use 30-bit digits by default for the Pythonintimplementation. Previously, the default was to use 30-bit digits on platformswithSIZEOF_VOID_P>=8, and 15-bit digits otherwise. It’s still possibleto explicitly request use of 15-bit digits via either the--enable-big-digits option to the configure scriptor (for Windows) thePYLONG_BITS_IN_DIGIT variable inPC/pyconfig.h,but this option may be removed at some point in the future.(Contributed by Mark Dickinson inbpo-45569.)

C API Changes

New Features

Porting to Python 3.11

  • Some macros have been converted to static inline functions to avoidmacro pitfalls.The change should be mostly transparent to users,as the replacement functions will cast their arguments to the expected typesto avoid compiler warnings due to static type checks.However, when the limited C API is set to >=3.11,these casts are not done,and callers will need to cast arguments to their expected types.SeePEP 670 for more details.(Contributed by Victor Stinner and Erlend E. Aasland ingh-89653.)

  • PyErr_SetExcInfo() no longer uses thetype andtracebackarguments, the interpreter now derives those values from the exceptioninstance (thevalue argument). The function still steals referencesof all three arguments.(Contributed by Irit Katriel inbpo-45711.)

  • PyErr_GetExcInfo() now derives thetype andtracebackfields of the result from the exception instance (thevalue field).(Contributed by Irit Katriel inbpo-45711.)

  • _frozen has a newis_package field to indicate whetheror not the frozen module is a package. Previously, a negative valuein thesize field was the indicator. Now only non-negative valuesbe used forsize.(Contributed by Kumar Aditya inbpo-46608.)

  • _PyFrameEvalFunction() now takes_PyInterpreterFrame*as its second parameter, instead ofPyFrameObject*.SeePEP 523 for more details of how to use this function pointer type.

  • PyCode_New() andPyCode_NewWithPosOnlyArgs() now takean additionalexception_table argument.Using these functions should be avoided, if at all possible.To get a custom code object: create a code object using the compiler,then get a modified version with thereplace method.

  • PyCodeObject no longer has theco_code,co_varnames,co_cellvars andco_freevars fields. Instead, usePyCode_GetCode(),PyCode_GetVarnames(),PyCode_GetCellvars() andPyCode_GetFreevars() respectivelyto access them via the C API.(Contributed by Brandt Bucher inbpo-46841 and Ken Jin ingh-92154andgh-94936.)

  • The old trashcan macros (Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END)are now deprecated. They should be replaced by the new macrosPy_TRASHCAN_BEGIN andPy_TRASHCAN_END.

    A tp_dealloc function that has the old macros, such as:

    staticvoidmytype_dealloc(mytype*p){PyObject_GC_UnTrack(p);Py_TRASHCAN_SAFE_BEGIN(p);...Py_TRASHCAN_SAFE_END}

    should migrate to the new macros as follows:

    staticvoidmytype_dealloc(mytype*p){PyObject_GC_UnTrack(p);Py_TRASHCAN_BEGIN(p,mytype_dealloc)...Py_TRASHCAN_END}

    Note thatPy_TRASHCAN_BEGIN has a second argument whichshould be the deallocation function it is in.

    To support older Python versions in the same codebase, youcan define the following macros and use them throughoutthe code (credit: these were copied from themypy codebase):

    #if PY_VERSION_HEX >= 0x03080000#  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)#  define CPy_TRASHCAN_END(op) Py_TRASHCAN_END#else#  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)#  define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)#endif
  • ThePyType_Ready() function now raises an error if a type is definedwith thePy_TPFLAGS_HAVE_GC flag set but has no traverse function(PyTypeObject.tp_traverse).(Contributed by Victor Stinner inbpo-44263.)

  • Heap types with thePy_TPFLAGS_IMMUTABLETYPE flag can now inheritthePEP 590 vectorcall protocol. Previously, this was only possible forstatic types.(Contributed by Erlend E. Aasland inbpo-43908)

  • SincePy_TYPE() is changed to a inline static function,Py_TYPE(obj)=new_type must be replaced withPy_SET_TYPE(obj,new_type): see thePy_SET_TYPE() function(available since Python 3.9). For backward compatibility, this macro can beused:

    #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)staticinlinevoid_Py_SET_TYPE(PyObject*ob,PyTypeObject*type){ob->ob_type=type;}#define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)#endif

    (Contributed by Victor Stinner inbpo-39573.)

  • SincePy_SIZE() is changed to a inline static function,Py_SIZE(obj)=new_size must be replaced withPy_SET_SIZE(obj,new_size): see thePy_SET_SIZE() function(available since Python 3.9). For backward compatibility, this macro can beused:

    #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)staticinlinevoid_Py_SET_SIZE(PyVarObject*ob,Py_ssize_tsize){ob->ob_size=size;}#define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)#endif

    (Contributed by Victor Stinner inbpo-39573.)

  • <Python.h> no longer includes the header files<stdlib.h>,<stdio.h>,<errno.h> and<string.h> when thePy_LIMITED_APImacro is set to0x030b0000 (Python 3.11) or higher. C extensions shouldexplicitly include the header files after#include<Python.h>.(Contributed by Victor Stinner inbpo-45434.)

  • The non-limited API filescellobject.h,classobject.h,code.h,context.h,funcobject.h,genobject.h andlongintrepr.h have been moved totheInclude/cpython directory. Moreover, theeval.h header file wasremoved. These files must not be included directly, as they are alreadyincluded inPython.h:Include Files. If they havebeen included directly, consider includingPython.h instead.(Contributed by Victor Stinner inbpo-35134.)

  • ThePyUnicode_CHECK_INTERNED() macro has been excluded from thelimited C API. It was never usable there, because it used internal structureswhich are not available in the limited C API.(Contributed by Victor Stinner inbpo-46007.)

  • The following frame functions and type are now directly available with#include<Python.h>, it’s no longer needed to add#include<frameobject.h>:

    (Contributed by Victor Stinner ingh-93937.)

  • ThePyFrameObject structure members have been removed from thepublic C API.

    While the documentation notes that thePyFrameObject fields aresubject to change at any time, they have been stable for a long time and wereused in several popular extensions.

    In Python 3.11, the frame struct was reorganized to allow performanceoptimizations. Some fields were removed entirely, as they were details of theold implementation.

    PyFrameObject fields:

    The Python frame object is now created lazily. A side effect is that thef_back member must not be accessed directly,since its value is now alsocomputed lazily. ThePyFrame_GetBack() function must be calledinstead.

    Debuggers that accessed thef_locals directlymust callPyFrame_GetLocals() instead. They no longer need to callPyFrame_FastToLocalsWithError() orPyFrame_LocalsToFast(),in fact they should not call those functions. The necessary updating of theframe is now managed by the virtual machine.

    Code definingPyFrame_GetCode() on Python 3.8 and older:

    #if PY_VERSION_HEX < 0x030900B1staticinlinePyCodeObject*PyFrame_GetCode(PyFrameObject*frame){Py_INCREF(frame->f_code);returnframe->f_code;}#endif

    Code definingPyFrame_GetBack() on Python 3.8 and older:

    #if PY_VERSION_HEX < 0x030900B1staticinlinePyFrameObject*PyFrame_GetBack(PyFrameObject*frame){Py_XINCREF(frame->f_back);returnframe->f_back;}#endif

    Or use thepythoncapi_compat project to get these twofunctions on older Python versions.

  • Changes of thePyThreadState structure members:

    Code definingPyThreadState_GetFrame() on Python 3.8 and older:

    #if PY_VERSION_HEX < 0x030900B1staticinlinePyFrameObject*PyThreadState_GetFrame(PyThreadState*tstate){Py_XINCREF(tstate->frame);returntstate->frame;}#endif

    Code definingPyThreadState_EnterTracing() andPyThreadState_LeaveTracing() on Python 3.10 and older:

    #if PY_VERSION_HEX < 0x030B00A2staticinlinevoidPyThreadState_EnterTracing(PyThreadState*tstate){tstate->tracing++;#if PY_VERSION_HEX >= 0x030A00A1tstate->cframe->use_tracing=0;#elsetstate->use_tracing=0;#endif}staticinlinevoidPyThreadState_LeaveTracing(PyThreadState*tstate){intuse_tracing=(tstate->c_tracefunc!=NULL||tstate->c_profilefunc!=NULL);tstate->tracing--;#if PY_VERSION_HEX >= 0x030A00A1tstate->cframe->use_tracing=use_tracing;#elsetstate->use_tracing=use_tracing;#endif}#endif

    Or usethe pythoncapi-compat project to get these functionson old Python functions.

  • Distributors are encouraged to build Python with the optimized Blake2librarylibb2.

  • ThePyConfig.module_search_paths_set field must now be set to 1 forinitialization to usePyConfig.module_search_paths to initializesys.path. Otherwise, initialization will recalculate the path and replaceany values added tomodule_search_paths.

  • PyConfig_Read() no longer calculates the initial search path, and will notfill any values intoPyConfig.module_search_paths. To calculate defaultpaths and then modify them, finish initialization and usePySys_GetObject()to retrievesys.path as a Python list object and modify it directly.

Deprecated

  • Deprecate the following functions to configure the Python initialization:

    • PySys_AddWarnOptionUnicode()

    • PySys_AddWarnOption()

    • PySys_AddXOption()

    • PySys_HasWarnOptions()

    • PySys_SetArgvEx()

    • PySys_SetArgv()

    • PySys_SetPath()

    • Py_SetPath()

    • Py_SetProgramName()

    • Py_SetPythonHome()

    • Py_SetStandardStreamEncoding()

    • _Py_SetProgramFullPath()

    Use the newPyConfig API of thePython Initialization Configuration instead (PEP 587).(Contributed by Victor Stinner ingh-88279.)

  • Deprecate theob_shash member of thePyBytesObject. UsePyObject_Hash() instead.(Contributed by Inada Naoki inbpo-46864.)

Pending Removal in Python 3.12

The following C APIs have been deprecated in earlier Python releases,and will be removed in Python 3.12.

  • PyUnicode_AS_DATA()

  • PyUnicode_AS_UNICODE()

  • PyUnicode_AsUnicodeAndSize()

  • PyUnicode_AsUnicode()

  • PyUnicode_FromUnicode()

  • PyUnicode_GET_DATA_SIZE()

  • PyUnicode_GET_SIZE()

  • PyUnicode_GetSize()

  • PyUnicode_IS_COMPACT()

  • PyUnicode_IS_READY()

  • PyUnicode_READY()

  • PyUnicode_WSTR_LENGTH()

  • _PyUnicode_AsUnicode()

  • PyUnicode_WCHAR_KIND

  • PyUnicodeObject

  • PyUnicode_InternImmortal()

Removed

  • PyFrame_BlockSetup() andPyFrame_BlockPop() have beenremoved.(Contributed by Mark Shannon inbpo-40222.)

  • Remove the following math macros using theerrno variable:

    • Py_ADJUST_ERANGE1()

    • Py_ADJUST_ERANGE2()

    • Py_OVERFLOWED()

    • Py_SET_ERANGE_IF_OVERFLOW()

    • Py_SET_ERRNO_ON_MATH_ERROR()

    (Contributed by Victor Stinner inbpo-45412.)

  • RemovePy_UNICODE_COPY() andPy_UNICODE_FILL() macros, deprecatedsince Python 3.3. UsePyUnicode_CopyCharacters() ormemcpy()(wchar_t* string), andPyUnicode_Fill() functions instead.(Contributed by Victor Stinner inbpo-41123.)

  • Remove thepystrhex.h header file. It only contains private functions.C extensions should only include the main<Python.h> header file.(Contributed by Victor Stinner inbpo-45434.)

  • Remove thePy_FORCE_DOUBLE() macro. It was used by thePy_IS_INFINITY() macro.(Contributed by Victor Stinner inbpo-45440.)

  • The following items are no longer available whenPy_LIMITED_APIis defined:

    These are not part of thelimited API.

    (Contributed by Victor Stinner inbpo-45474.)

  • ExcludePyWeakref_GET_OBJECT() from the limited C API. It neverworked since thePyWeakReference structure is opaque in thelimited C API.(Contributed by Victor Stinner inbpo-35134.)

  • Remove thePyHeapType_GET_MEMBERS() macro. It was exposed in thepublic C API by mistake, it must only be used by Python internally.Use thePyTypeObject.tp_members member instead.(Contributed by Victor Stinner inbpo-40170.)

  • Remove theHAVE_PY_SET_53BIT_PRECISION macro (moved to the internal CAPI).(Contributed by Victor Stinner inbpo-45412.)

  • Remove thePy_UNICODE encoder APIs,as they have been deprecated since Python 3.3,are little usedand are inefficient relative to the recommended alternatives.

    The removed functions are:

    • PyUnicode_Encode()

    • PyUnicode_EncodeASCII()

    • PyUnicode_EncodeLatin1()

    • PyUnicode_EncodeUTF7()

    • PyUnicode_EncodeUTF8()

    • PyUnicode_EncodeUTF16()

    • PyUnicode_EncodeUTF32()

    • PyUnicode_EncodeUnicodeEscape()

    • PyUnicode_EncodeRawUnicodeEscape()

    • PyUnicode_EncodeCharmap()

    • PyUnicode_TranslateCharmap()

    • PyUnicode_EncodeDecimal()

    • PyUnicode_TransformDecimalToASCII()

    SeePEP 624 for details andmigration guidance.(Contributed by Inada Naoki inbpo-44029.)

Notable changes in 3.11.4

tarfile

  • The extraction methods intarfile, andshutil.unpack_archive(),have a new afilter argument that allows limiting tar features than may besurprising or dangerous, such as creating files outside the destinationdirectory.SeeExtraction filters for details.In Python 3.12, use without thefilter argument will show aDeprecationWarning.In Python 3.14, the default will switch to'data'.(Contributed by Petr Viktorin inPEP 706.)

Notable changes in 3.11.5

OpenSSL

  • Windows builds and macOS installers from python.org now use OpenSSL 3.0.