Python 3.15 Release Date, New Features, and How to Upgrade
Python 3.15.0 is officially out, bringing lazy imports, a frozendict builtin, a redesigned profiling toolkit, and a faster experimental JIT. Here's what changed and how to upgrade.

Python 3.15.0 is officially out. The Python Software Foundation shipped the new version on October 9, 2026, and it is now listed as the current stable release on python.org, with lazy imports, a new frozendict builtin, a dedicated profiling package, and a batch of interpreter and C API changes headlining the release. Here is what actually changed, where the project's own release notes document it, and how to move your projects onto 3.15 without breaking anything.
- Released: October 9, 2026
- Release manager: Hugo van Kemenade
- Scale: 5,643 commits from 1,012 contributors since 3.14, per the official release page
- Headline features: explicit lazy imports (PEP 810), a
frozendictbuiltin (PEP 814), asentinelbuiltin (PEP 661), unpacking in comprehensions (PEP 798), a newprofilingpackage with the Tachyon sampler (PEP 799) - Current phase: bugfix; full security-only phase begins in 2028; end of life scheduled for October 2031
Python 3.15 release date: what python.org confirms
Python's own 3.15.0 release page lists "Oct. 9, 2026" as the release date, matching the schedule laid out in PEP 790, the release-cycle document for this version. Python follows an annual release cadence, so 3.15 arrives roughly a year after Python 3.14, which shipped in October 2025. Hugo van Kemenade served as release manager for both 3.14 and 3.15, work that python.org notes was supported in part by a Sovereign Tech Fellowship.
That annual cycle is a deliberate contrast to how other ecosystems ship. Node.js, for instance, promotes a new release to Active LTS on a similar October schedule, but Python's cadence has stayed fixed at one feature release per year since PEP 602 formalized it, which is part of why the October 3.15 date was predictable well in advance.
Python 3.15 new features: lazy imports, frozendict, and more
The biggest language-level additions in 3.15, as documented in the official What's New in Python 3.15 page, are:
- Explicit lazy imports (PEP 810): a new
lazysoft keyword lets you writelazy import jsonorlazy from pathlib import Pathso the module is not actually loaded until its first use. It is restricted to module scope — using it inside a function, class, ortryblock raises aSyntaxError— and can be toggled globally with the-X lazy_importsflag, thePYTHON_LAZY_IMPORTSenvironment variable, or at runtime withsys.set_lazy_imports(). frozendictbuiltin (PEP 814): an immutable, hashable mapping type that inherits fromobjectrather thandict, with order-independent equality. The docs note thatjson,pickle,copy, andpprintalready understand it.sentinelbuiltin (PEP 661): a standard way to create unique sentinel values, usable directly in type expressions with the|operator.- Unpacking in comprehensions (PEP 798):
*and**now work inside list, set, dict, and generator comprehensions. The release notes give the example[*L for L in lists]to flatten a list of lists, and{**d for d in dicts}to merge a sequence of dicts. - Package startup configuration files (PEP 829): new
.startfiles can registerpkg.mod:callableentry points that run automatically at interpreter startup, andimportlines inside legacy.pthfiles are now silently ignored once a matching.startfile exists.
The project also highlights broad "improved error messages" work: AttributeError now offers more targeted suggestions (for example, pointing from .area to .inner.area on a nested object), and builtin types suggest the correct method when you reach for a name borrowed from another language, such as recommending .append() when code calls a list's nonexistent .push().
A dedicated profiling package and the Tachyon sampler
Python 3.15 splits profiling out of cProfile into its own top-level profiling package, per PEP 799. It has two submodules: profiling.tracing, which carries over the deterministic profiler previously built into cProfile (kept as an alias), and profiling.sampling, home to a new statistical sampling profiler nicknamed Tachyon.
According to the official what's-new document, Tachyon can sample a running process at up to 1,000,000 Hz with low overhead, can attach to an already-running process by PID, supports wall-clock, CPU, GIL, and exception sampling modes, and ships a --live terminal UI plus export formats including --pstats, --collapsed, --flamegraph, --gecko, and --heatmap. The plain profile module, by contrast, is now deprecated and scheduled for removal in Python 3.17.
Interpreter, JIT, and C API changes
Several changes in 3.15 are aimed at lower-level tooling and extension authors rather than everyday application code:
- Frame pointers by default (PEP 831): CPython is now built with
-fno-omit-frame-pointerand related flags where the platform supports them, which the docs say improves native stack unwinding for external profilers and debuggers. - Experimental JIT compiler: the release notes describe "a significantly upgraded experimental JIT compiler" compared to 3.14, continuing work introduced in earlier 3.1x releases.
- Stable ABI for free-threaded builds (PEP 803): extension authors can now target an
abi3tstable ABI that is compatible with free-threaded CPython, building on related C API work in PEP 793 and PEP 820. - Finalization protection (PEP 788): new interpreter guard and interpreter-view APIs, plus thread attach/detach functions, protect C extensions from crashing during interpreter shutdown. The long-standing
PyGILState_*family is now soft-deprecated, though the docs say there's no removal planned. - UTF-8 as the default encoding (PEP 686): when code opens a file or stream without an explicit
encodingargument, Python now defaults to UTF-8 rather than a platform-dependent locale encoding. This can be reverted withPYTHONUTF8=0or the-X utf8=0flag if you need the old behavior while you audit code.
Standard library and typing updates
Beyond the headline PEPs, the What's New document lists a long tail of standard-library changes. Typing gets three notable additions: TypedDict support for typed "extra" items (PEP 728), TypeForm annotations for representing types as values (PEP 747), and disjoint base classes (PEP 800). A new math.integer module (PEP 791) adds integer-specific math functions.
| Area | Change |
|---|---|
| subprocess | Popen.wait(timeout=...) now waits using pidfd/poll on Linux and kqueue on BSD/macOS instead of busy-looping. |
| bytearray | New take_bytes(n=None, /) method returns bytes without copying the buffer. |
| json | New array_hook parameter, which combined with frozendict and tuple can produce fully immutable parsed results. |
| re | New explicit prefixmatch() name for the existing match() behavior; match() itself is soft-deprecated. |
| argparse | suggest_on_error now defaults to True, and help text supports backtick markup. |
| gc | The incremental garbage collector used in Python 3.14.0–3.14.4 was reverted back to the generational collector. |
| tomllib | Support for TOML 1.1.0. |
On the security side, the release notes report fixes in tarfile's extraction filters — including a new LinkFallbackError and normalization of symlink targets in data_filter() — addressing CVE-2025-4138, CVE-2024-12718, CVE-2025-4330, and CVE-2025-4435. os.path.realpath() also gained an ALLOW_MISSING option for its strict parameter, addressing CVE-2025-4517.
Deprecations and removals to check before upgrading
A few changes are worth testing against before you flip a production service to 3.15:
- The old
profilemodule is deprecated in favor of the newprofilingpackage and is slated for removal in Python 3.17. importlines inside.pthfiles are silently ignored once a corresponding.startfile exists, as part of the PEP 829 rollout.- The
__cached__module attribute is no longer set or used by the import system. - Default encoding behavior changes under PEP 686; code relying on a locale-dependent default encoding when no
encoding=argument is passed should be checked. PyGILState_*C API functions are soft-deprecated for extension authors, though not scheduled for removal.
The official changelog has dedicated "Deprecated" and "Removed" sections with the complete, version-by-version list — worth a direct read if you maintain C extensions or packages that touch import internals.
Python release and support schedule
Python 3.15 enters its roughly 18-month "bugfix" phase first, then moves to security-only maintenance, per the version table published in the Python Developer's Guide:
| Branch | Status | First release | End of life |
|---|---|---|---|
| 3.16 (main) | Feature | 2027-10 (scheduled) | 2032-10 (scheduled) |
| 3.15 | Bugfix | 2026-10-09 | 2031-10 (scheduled) |
| 3.14 | Bugfix | 2025-10-07 | 2030-10 (scheduled) |
| 3.13 | Security | 2024-10-07 | 2029-10 (scheduled) |
| 3.12 | Security | 2023-10-02 | 2028-10 |
In other words, 3.15 will receive regular bugfix releases for a little under two years before dropping into security-only mode, with final end of life currently scheduled for October 2031.
How to upgrade to Python 3.15
For most developers, upgrading is straightforward:
- Download the official build: installers for Windows and macOS, plus source tarballs, are on the Python 3.15.0 download page. Linux users should check their distribution's package manager, since many distributions lag the upstream release by weeks or months.
- Use a version manager for multiple Python versions: tools like
pyenvlet you install 3.15 alongside existing versions without disturbing projects pinned to 3.13 or 3.14. - Create a fresh virtual environment: run
python3.15 -m venv .venvand reinstall your dependencies from a lockfile rather than upgrading an existing environment in place. If your team already standardizes on a faster installer or workspace tool for other ecosystems — the way some JavaScript teams moved to pnpm as a faster, stricter alternative to npm — the same "reproducible, isolated environment" instinct applies when bringing in a new Python minor version. - Test against the new UTF-8 default first: since PEP 686 changes the implicit default encoding, run your test suite with
-X utf8=0and then without it to catch any code that depended on a platform-specific locale encoding. - Check C extensions and build tooling: if your project or its dependencies ship compiled extensions, confirm they have wheels built for 3.15 before deploying; packages using older stable-ABI tags may need an update to support free-threaded 3.15 builds.
- Read the porting guide: the "Porting to Python 3.15" section of the official What's New document specifically lists breaking changes application and library authors need to check.
Should you upgrade now?
For new projects and anyone comfortable testing against a freshly released interpreter, 3.15 is worth adopting quickly: lazy imports can measurably cut startup time for CLI tools and large applications that import rarely-used modules, the new profiling package and Tachyon sampler are a real upgrade for anyone debugging performance in production, and the security fixes in tarfile and os.path.realpath() close real CVEs rather than theoretical ones.
For production services on a slower upgrade cadence, the more conservative path is to let 3.15.1 or 3.15.2 land first, since early point releases for any new Python version tend to catch edge cases in big changes like the UTF-8 default switch and the reworked garbage collector behavior. Either way, python.org's own schedule gives you plenty of runway: 3.14 remains in its bugfix phase for a while yet, and 3.13 still gets security updates into 2029, so there's no urgent forcing function to jump straight to 3.15 on day one.
Frequently asked questions
When was Python 3.15 released? Python 3.15.0 was released on October 9, 2026, per the official release page on python.org.
What are the biggest new features in Python 3.15? The headline additions are explicit lazy imports, a frozendict builtin, a sentinel builtin, unpacking support inside comprehensions, and a new top-level profiling package built around the Tachyon sampling profiler.
Does Python 3.15 change default file encoding behavior? Yes. Under PEP 686, Python now defaults to UTF-8 when no encoding argument is supplied, instead of a platform-dependent locale encoding. You can temporarily restore the old behavior with PYTHONUTF8=0 while you test.
How long will Python 3.15 be supported? It is currently in its bugfix maintenance phase, with a scheduled transition to security-only support and a final end-of-life date in October 2031, according to the Python Developer's Guide.
Where can I download Python 3.15? Official installers, source tarballs, and documentation links are on the Python 3.15.0 release page at python.org; Linux users should also check whether their distribution's package repositories have picked it up yet.
Frequently asked questions
When was Python 3.15 released?
Python 3.15.0 was released on October 9, 2026, per the official release page on python.org.
What are the biggest new features in Python 3.15?
The headline additions are explicit lazy imports (PEP 810), a frozendict builtin (PEP 814), a sentinel builtin (PEP 661), unpacking support inside comprehensions (PEP 798), and a new top-level profiling package built around the Tachyon sampling profiler (PEP 799).
Does Python 3.15 change default file encoding behavior?
Yes. Under PEP 686, Python now defaults to UTF-8 when no encoding argument is supplied, instead of a platform-dependent locale encoding. You can temporarily restore the old behavior with PYTHONUTF8=0 while you test.
How long will Python 3.15 be supported?
It is currently in its bugfix maintenance phase, with a scheduled transition to security-only support and a final end-of-life date in October 2031, according to the Python Developer's Guide.
Where can I download Python 3.15?
Official installers, source tarballs, and documentation links are on the Python 3.15.0 release page at python.org; Linux users should also check whether their distribution's package repositories have picked it up yet.
What happened to Python's profiling tools in 3.15?
Profiling moved out of cProfile into a new top-level profiling package with two submodules: profiling.tracing for deterministic profiling and profiling.sampling, home to the new Tachyon statistical sampler that can run at up to 1,000,000 Hz with low overhead.
Sources
- Python.org: Python 3.15.0 release pagepython.org
- Python Docs: What's New in Python 3.15docs.python.org
- Python Developer's Guide: Status of Python versionsdevguide.python.org
- PEP 790: Python 3.15 Release Schedulepeps.python.org
- PEP 810: Explicit Lazy Importspeps.python.org
- PEP 799: A dedicated profiling packagepeps.python.org
Felix Moreau writes Pandromeda's software coverage and how-to guides. He covers Windows, macOS and Linux updates, the apps people rely on, emulators and developer tools, and turns official documentation into clear, numbered steps that work on the current version.

