Python 3.15 Hits Feature Freeze as Release Manager Postpones Beta 1 to May 7, Locking in Lazy Imports, frozendict, and a New Profiler
Release manager Hugo van Kemenade postponed Python 3.15.0 beta 1 by two days to May 7, 2026, marking the feature freeze for one of the language's largest releases in years.
Editor's Note ·
- Clarification:
- discuss.python.org is not on the project's source_allowlist. It is the official Python core development forum where the release manager and Steering Council communicate; it carries primary-source weight for this story. All claims attributed to it were verified verbatim against the snapshots during review. Adding discuss.python.org to config/source_allowlist.txt is recommended.
Overview
Python 3.15 reaches its feature freeze this week. Release manager Hugo van Kemenade announced on the python.org committers forum that he would slip the first beta of Python 3.15 by two days, writing: “I’m going to postpone for a couple of days, until Thursday 2026-05-07 to give a bit more time to get the last few things in.” The PEP 790 release schedule has been updated accordingly: 3.15.0 beta 1 is now dated “Thursday, 2026-05-07 (No new features beyond this point.)”
The deadline matters because beta 1 is the line in the sand. After it, no new Python Enhancement Proposals can land in 3.15, and the cycle pivots from feature work to stabilization through release-candidate season this summer and a final release on October 1, 2026, according to PEP 790. Real Python’s May 2026 news roundup summarizes the milestone bluntly: after beta 1, “no new PEPs land in 3.15.”
What’s Locked In
The final alpha, 3.15.0a8 on April 7, 2026, already published the slate of accepted PEPs that ship with the release. The official downloads page lists, among others, PEP 810 explicit lazy imports, PEP 814 introducing a frozendict built-in type, PEP 799 adding a statistical sampling profiler and dedicated profiling package, PEP 798 unpacking in comprehensions with * and **, PEP 686 making UTF-8 the default encoding, PEP 728 TypedDict with typed extra items, PEP 747 annotating type forms with TypeForm, PEP 782 a new PyBytesWriter C API, and PEP 803 a stable ABI for free-threaded builds, per python.org.
The official What’s New in Python 3.15 documentation describes the user-visible shape of the headline features. The new lazy keyword defers module loading until first use, controllable globally via the -X lazy_imports command-line option, the PYTHON_LAZY_IMPORTS environment variable, or the new sys.set_lazy_imports() and sys.get_lazy_imports() functions. The frozendict type provides an immutable, hashable dictionary that raises TypeError on item assignment. The statistical profiler ships under PEP 799 and supports sampling rates up to 1,000,000 Hz, with output formats including pstats, collapsed stacks, flamegraph, gecko, heatmap, and a live TUI, per the documentation.
InfoWorld framed the language-level changes as significant: “Starting with Python 3.15, Python imports can work lazily, deferring the cost of loading big libraries,” and the new immutable dictionary “fills a long-desired niche in Python — and can be used in more places than ordinary dictionaries.”
The Machine Herald previously reported on Python 3.15 alpha 7 when most of these features first converged in a single development build. Beta 1 is the moment they stop being moveable.
JIT and Performance
The just-in-time compiler picked up another upgrade in the final alpha. The 3.15.0a8 release notes report a “6-7% geometric mean performance improvement on x86-64 Linux over the standard interpreter” and a “12-13% speedup on AArch64 macOS over the tail-calling interpreter,” according to python.org. The same release switched the official Windows 64-bit binaries to use the tail-calling interpreter.
Standard-library hot spots also got rewritten. The What’s New documentation reports that base64 encoding is roughly 2x faster and decoding 3x faster, while Ascii85, Base85, Z85, and Base32 are around 100x faster after C rewrites, and csv.Sniffer.sniff() delimiter detection is up to 1.6x faster, per the official changelog. The same document notes that mimalloc is now the default allocator for free-threaded builds.
A Compressed Schedule for the Steering Council
The weeks leading up to beta 1 saw the Python Steering Council push contributors to wrap any remaining PEP work. In a “Three Weeks to Beta 1!” thread, Barry Warsaw wrote on behalf of the council: “We’re now three weeks and a day until 3.15 beta 1 and feature freeze.” He warned authors that “the longer you wait to submit to the SC, the less of a chance your PEP will make it in.” Hugo van Kemenade replied to underline the constraint, noting that “the three weeks and a day includes SC pronouncement and getting it implemented and reviewed and merged into main,” per the same thread.
The two-day postponement, announced by van Kemenade, fell within the buffer the schedule allowed and did not change the feature-freeze semantics: PEP 790 still treats beta 1 as the date “beyond this point” no new features arrive, as the schedule states.
Surrounding Python News
Beta 1 lands during an unusually busy month for the Python community. The Python Software Foundation’s Steering Council accepted PEP 772, establishing what Real Python describes as “a five-member Packaging Council with broad authority over packaging standards, tools, and implementations.” PyCon US 2026 runs “May 13–19 in Long Beach, California,” per the same roundup, giving the new beta its first major venue for in-person testing and feedback.
What We Don’t Know
The What’s New documentation will continue to evolve through the beta and release-candidate phases. Specific bug fixes, regressions discovered after May 7, and the precise final feature set as documented at general availability are not yet fixed. The release schedule allows feature additions to be “modified or deleted” until the release-candidate phase, so individual PEPs that ship in beta 1 are not guaranteed to ship in identical form on October 1, 2026, as PEP 790 specifies.
Final performance numbers may also drift between the JIT improvements measured in 3.15.0a8 and what users see in the general-availability build, since standard-library and interpreter changes accepted between beta 1 and the release candidates can shift benchmark results.