Today Release 3.13 November 2025 — Python News

Nearly two years in the making, Python 3.13 builds upon the revolutionary foundations of 3.11 ("Faster CPython"), 3.12 ("More typing and better errors"), and the experimental 3.13 prereleases. With over 400 new commits, three major PEPs (Python Enhancement Proposals), and a host of stability improvements, this release marks the moment where "Python performance" stops being an oxymoron. "Python 3.13 is what happens when a community decides that slow is a choice, not a destiny." – RealPython Editorial Team, November 2025 Let’s dive into the headline features, the subtle breaking changes, and why you should upgrade your production environment before the end of the quarter. The single most anticipated feature of Python 3.13 is the production-ready stabilization of sub-interpreters , as defined by PEP 734 (a refinement of the earlier PEP 554).

wget https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz tar -xzf Python-3.13.0.tgz cd Python-3.13.0 ./configure --enable-optimizations --with-jit make -j$(nproc) sudo make altinstall python news today release 3.13 november 2025

The Steering Council chose sub-interpreters over a GIL-less build (still available as --disable-gil for the brave) because sub-interpreters maintain full C-extension compatibility – a critical requirement for the scientific and data science ecosystems (NumPy, Pandas, TensorFlow all work unchanged). Takeaway: For CPU-bound workloads, rewrite your multiprocessing code to use interpreters.Pool . For I/O-bound tasks, asyncio remains king. 2. JIT Compilation Graduates from Experimental (PEP 744) PEP 744 , the Copy-and-Patch JIT compiler introduced as an experiment in Python 3.13 beta, is now enabled by default on x86-64 and ARM64 builds. Nearly two years in the making, Python 3

def is_str_list(obj: list[object]) -> TypeIs[list[str]]: return all(isinstance(item, str) for item in obj) data: list[object] = ["a", "b", 3] if is_str_list(data): # In this block, mypy knows data is list[str] reveal_type(data) # list[str] Building on Python 3.11’s improved tracebacks, 3.13 introduces an interactive exception explanation system. The single most anticipated feature of Python 3

pool = interpreters.Pool(8) # 8 CPU cores results = pool.map(is_prime, range(10_000_000, 10_000_100)) print(sum(results))

import interpreters import math def is_prime(n): return all(n % i != 0 for i in range(2, int(math.sqrt(n)) + 1))