Python 3.15: What’s New

Python 3.15’s key changes — lazy imports, a new profiling package, JIT speedups, and and the other PEPs worth knowing about in the final 3.15.0 release

Featured

Python 3.15.0 was released on 9 October 2026, after a release-candidate phase that began on 4 August. A surprise third candidate on 2 October, caused by last-minute lazy-import release blockers, moved the final release back from 1 October. Here’s what actually changes.

Faster startup: lazy imports (PEP 810)

Python 3.15 adds explicit lazy imports — import numpy can be marked to defer the actual import until the name is first used, rather than at module load time. For CLI tools and scripts that import a lot but only use a fraction of it on any given run, this meaningfully cuts startup time. It’s opt-in and explicit, not a silent behavior change to existing imports. The third release candidate was cut because of last-minute lazy-import release blockers, with fixes for edge cases such as lazy import a.b as c binding and sys.lazy_modules bookkeeping, so make sure you’re on 3.15.0 final (or at least rc3) when you test the feature.

New built-in types: frozendict and sentinel (PEP 814, PEP 661)

frozendict joins frozenset as an immutable built-in — a hashable, read-only dict, useful anywhere you’d otherwise defensively copy a dict to stop callers mutating it. The new sentinel type standardizes the “unique marker object” pattern (commonly hand-rolled as _MISSING = object()) into something the standard library and type checkers understand natively.

A real profiling package (PEP 799)

Python’s profiling tools — cProfile, the newer statistical sampling approach — get organized under a single profiling namespace: profiling.tracing (deterministic call tracing, the cProfile successor) and profiling.sampling, built around a new high-frequency statistical sampler called Tachyon. cProfile remains as a backwards-compatible alias, so existing code doesn’t break.

The experimental JIT gets faster

Python’s JIT (introduced experimentally in 3.13) shows a meaningful step up in 3.15 — core developers report roughly 7-8% geometric-mean speedup on x86-64 Linux over the standard interpreter and 11-12% on AArch64 macOS over the tail-calling interpreter. Still experimental and not the default, but the gap to “worth enabling” is closing release over release.

Typing improvements

If you’re working through our type hints guide, a few additions are relevant: TypedDict now supports typed extra items (PEP 728) — you can allow additional keys beyond the declared ones while still typing what those extras look like — and TypeForm (PEP 747) lets you annotate a value that represents a type itself, useful for functions that take a type as an argument (validators, serializers, factory functions).

Smaller changes worth knowing

  • UTF-8 as the default encoding (PEP 686) — open() without an encoding argument now uses UTF-8 regardless of the system locale, so fewer platform-dependent surprises, particularly on Windows. See Porting to Python 3.15 for what to check.
  • Unpacking in comprehensions (PEP 798) — [*x for x in nested]-style unpacking now works directly inside comprehension expressions.
  • Disjoint bases in the type system (PEP 800) — lets type checkers understand that two classes can never share an instance, tightening isinstance narrowing in some patterns.

Should you upgrade on day one?

For most projects, no rush (see which versions are still supported on the Python end-of-life dates page) — wait for 3.15.1 or .2 the way you would for any .0 release, unless lazy imports or the JIT improvements solve a specific problem you already have. Library maintainers can start testing and publishing 3.15 wheels now, since 3.15 support in dependencies tends to lag the language release by weeks to months.

Frequently Asked Questions

When was Python 3.15 released?

Python 3.15.0 final was released on 9 October 2026. The release-candidate phase began on 4 August and RC2 shipped on 1 September. An unplanned third candidate followed on 2 October because of last-minute lazy-import release blockers, which moved the final release from 1 October to 9 October.

What are the biggest changes in Python 3.15?

Explicit lazy imports for faster startup (PEP 810), new frozendict and sentinel built-in types, a reorganized profiling package with a new Tachyon statistical sampler, and a meaningfully faster experimental JIT.

Should you upgrade to Python 3.15 on day one?

For most projects, no rush — wait for 3.15.1 or .2 the way you would for any .0 release, unless lazy imports or the JIT improvements solve a specific problem you already have. Library maintainers can test against 3.15.0 now.

What are lazy imports in Python 3.15?

PEP 810 lets an import be marked to defer the actual import until the name is first used, rather than at module load time. For CLI tools and scripts that import a lot but use only a fraction on any given run, this meaningfully cuts startup time.