Python 3.15 Features: Every Major Change Explained

RunFreeTools TeamJun 15, 20265 min read

Python 3.15 features arrive in beta with explicit lazy imports, a new frozendict built-in, and a faster JIT that the core team measures at roughly 8-9% over the standard interpreter. The first beta landed on May 7, 2026, marking feature freeze, with the final release scheduled for October 1, 2026.

If you maintain anything in Python, this is the release to start testing now. Below is every Python 3.15 feature that genuinely changes how you write or ship code, grounded in the official What's New In Python 3.15 documentation and the python.org release notes. Each item here is confirmed in the beta, not speculation about what might land later.

When is Python 3.15 released?

The final, production-ready Python 3.15.0 is scheduled for October 1, 2026. Right now we are in the beta phase: Python 3.15.0b1 shipped on May 7, 2026 as the first of four planned betas, per PEP 790, the official release schedule. May 7 was also the feature freeze, so nothing new lands beyond that point, only bug fixes and stabilization. Two release candidates follow on August 4 and September 1, 2026.

The beta is explicitly not for production. It exists so library maintainers and application authors can catch breakage early. That is exactly what makes mid-2026 the right moment to wire the Python 3.15 beta into your CI matrix.

How much faster is the JIT in Python 3.15?

The experimental JIT compiler, first introduced in 3.13, gets a significant upgrade. The core developers report an 8-9% geometric-mean speedup on x86-64 Linux over the standard interpreter, and a 12-13% speedup on AArch64 macOS over the tail-calling interpreter. Those are real, measured figures from the beta 1 announcement, not projections, and they apply to general workloads rather than a single cherry-picked benchmark.

Two more performance notes matter. First, the official Windows 64-bit binaries now ship with the tail-calling interpreter, a faster opcode-dispatch technique, by default. Second, the incremental garbage collector that debuted in 3.14 has been reverted to the older generational GC after production reports of memory pressure, a pragmatic walk-back worth knowing if you recently tuned GC behavior.

Lazy imports: the headline language feature

PEP 810 introduces explicit lazy imports, the change most teams will feel first. A new lazy soft keyword defers loading a module until the first time you actually touch it:

lazy import numpy as np  # numpy loads only when np is first used

For large applications with deep dependency trees, top-level imports can cost real startup time even when most of that code never runs in a given invocation. Lazy imports let you defer that cost to first use, which is a meaningful win for CLI tools and serverless functions where cold-start latency is visible to users. You can also flip it on globally with the -X lazy_imports flag or the PYTHON_LAZY_IMPORTS environment variable, and inspect state through sys.get_lazy_imports() and a new sys.set_lazy_imports_filter() hook.

New built-in types: frozendict and sentinel

3.15 adds two long-requested built-ins.

  • frozendict (PEP 814) is an immutable, hashable mapping. Unlike a regular dict it cannot be mutated after creation, and it is hashable as long as its keys and values are, so you can finally use a dictionary as a set member or dict key without rolling your own wrapper. It is not a dict subclass; it inherits directly from object, and it is wired into json, pickle, and copy.
  • sentinel (PEP 661) provides a standard way to create unique sentinel objects with a clean repr, solving the perennial "None is a valid value" problem in APIs. Sentinels keep their identity when copied and can appear in type expressions.

Syntax, typing, and standard-library changes

A cluster of smaller changes rounds out the release:

  1. Unpacking in comprehensions (PEP 798): you can now use * and ** inside list, set, and dict comprehensions and generator expressions, for example [*row for row in rows].
  2. UTF-8 by default (PEP 686): text I/O without an explicit encoding now uses UTF-8, ending years of platform-dependent cp1252-versus-utf-8 surprises on Windows. Opt out with PYTHONUTF8=0.
  3. The Tachyon sampling profiler (PEP 799) ships in a dedicated profiling package, samples at up to 1,000,000 Hz, and can attach to an already-running process with near-zero overhead, emitting flamegraph, Firefox-compatible gecko, and live-TUI output.
  4. TypeForm (PEP 747) gives type checkers a first-class way to annotate type expressions, and TypedDict gains closed and extra_items support (PEP 728).
  5. A new math.integer module (PEP 791) groups integer-only math functions, unicodedata moves to Unicode 17.0.0, and tomllib gains TOML 1.1.0 support.

What about free-threading and the no-GIL build?

Free-threaded CPython became officially supported, not experimental, in 3.14 under PEP 779. In 3.15 it remains officially supported but still optional, not the default build. The relevant new piece is PEP 803, which defines a Stable ABI for free-threaded builds, so C-extension authors can ship a single binary that works across free-threaded versions without recompiling for each one. That is a quiet but important step toward a no-GIL future becoming routine for the wider ecosystem rather than just early adopters.

Deprecations and removals to watch

Beyond additions, 3.15 prunes the standard library. The legacy profile module is deprecated, with removal planned for 3.17, in favor of the new profiling package. re.match() and re.Pattern.match() are softly deprecated in favor of the more clearly named prefixmatch(), and import lines in .pth files are now silently deprecated. As always, a stack of items deprecated in earlier versions across modules like ast, ctypes, pathlib, and typing are now fully removed, so run your suite under -W error to surface them.

How to try the Python 3.15 beta

Grab the installer from the python.org downloads page, or use a version manager. With pyenv it is pyenv install 3.15.0b2. The safest path is an isolated environment, python3.15 -m venv .venv315, so the beta never touches your system interpreter. Point your CI at it, exercise your real test suite, and report regressions upstream while there is still runway before the October 1 release.

Frequently asked questions

The final Python 3.15.0 is scheduled for October 1, 2026. The first beta (3.15.0b1) shipped on May 7, 2026, followed by three more betas and two release candidates on August 4 and September 1, 2026, per PEP 790.

No. The Python core team explicitly labels beta releases as previews not recommended for production. They are intended for library maintainers and application authors to test compatibility and report bugs before the October 2026 final release.

No. Free-threaded CPython became officially supported (not experimental) in 3.14 under PEP 779, and in 3.15 it stays officially supported but optional, not the default build. Python 3.15 adds PEP 803, a Stable ABI for free-threaded builds, so C-extension authors can ship compatible binaries.

Explicit lazy imports (PEP 810) are the headline change. A new `lazy` keyword defers module loading until first use, cutting startup time for large apps, CLIs, and serverless functions. Other major additions include the `frozendict` built-in (PEP 814) and the Tachyon sampling profiler (PEP 799).

Download the beta installer from python.org, or use a version manager such as pyenv with `pyenv install 3.15.0b2`. Create an isolated environment with `python3.15 -m venv .venv315` so the beta never replaces your system Python, then run your test suite against it.

Sources

Share this article

Send it to a teammate or save the link for later.

New tools, straight to your inbox

A short note whenever we ship a new free tool or guide. No spam, unsubscribe in one click.

5min left