The Python release team published Python 3.15.0 on October 9, 2026, the first stable release in the language’s 3.15 series. It adds opt-in lazy imports, an immutable frozendict type, a dedicated profiling package and UTF-8 as the default text encoding, and it upgrades the experimental just-in-time (JIT) compiler.

According to the release announcement, the version was built from 5,643 commits by 1,012 contributors. Hugo van Kemenade, who also managed Python 3.14, was release manager; the python.org release page credits the Sovereign Tech Fellowship with supporting that work.

Lazy imports

The most visible language change comes from Python Enhancement Proposal (PEP) 810, which adds lazy as a soft keyword. According to the What’s New in Python 3.15 documentation, writing lazy import json makes Python create a lightweight proxy object instead of loading the module straight away; the module is loaded when the name is first used. If loading fails, the error is raised at that first use, and the traceback shows both the access location and the original import statement.

Lazy imports are allowed only at module scope. Using the keyword inside a function, a class body or a try, except or finally block raises a SyntaxError, and star imports and __future__ imports cannot be lazy. The -X lazy_imports command-line option and the PYTHON_LAZY_IMPORTS environment variable accept all, which makes every import lazy, or normal, the default, which respects the keyword. A filter function, set with sys.set_lazy_imports_filter(), lets an application force specific imports to load eagerly.

UTF-8 by default

Under PEP 686, input/output (I/O) operations that do not pass an explicit encoding now use UTF-8. The documentation gives a plain open() call on a text file as an example. It recommends always providing an explicit encoding argument for compatibility between Python versions, and says UTF-8 mode can be disabled with the PYTHONUTF8=0 environment variable or the -X utf8=0 option.

New types, profiler and performance

PEP 814 adds frozendict, an immutable mapping that is hashable as long as all of its keys and values are hashable. The documentation notes that it is not a subclass of dict, and suggests that code checking isinstance(arg, dict) test for both types or use collections.abc.Mapping. PEP 661 adds a sentinel built-in type for unique placeholder values.

PEP 799 introduces a profiling package that includes Tachyon, which the announcement describes as a high-frequency statistical sampling profiler. The older profile module is deprecated and scheduled for removal in Python 3.17.

On speed, the announcement says the upgraded JIT shows a 7–8% geometric mean improvement over the standard interpreter on x86-64 Linux, and an 11–12% speedup over the tail-calling interpreter on AArch64 macOS. Official 64-bit Windows binaries now use the tail-calling interpreter, and the official macOS installers now install free-threading support by default. PEP 831 turns on frame pointers by default, and PEPs 803, 820 and 793 add a stable application binary interface (ABI) for free-threaded builds.

Why it matters

The UTF-8 default affects any program that reads or writes text without naming an encoding, which is why the documentation pairs it with a recommendation to pass encodings explicitly and provides switches to turn it off. Lazy imports, by contrast, change nothing unless developers add the keyword or enable the global mode, so existing code keeps importing eagerly. The release page describes the feature as explicit lazy imports “for faster startup times.”

Maintainers of C extensions get a new option in the stable ABI for free-threaded builds, which lets extensions be compatible with free-threaded CPython, though the documentation warns that adopting it “usually requires some non-trivial changes to the source code.” Code that type-checks mappings may also need updating to accept frozendict.

Support timeline

Under PEP 790, the 3.15 release schedule, the series will receive bugfix releases approximately every second month for two years. After that, source-only security fixes are planned until approximately October 2031, five years after the 3.15.0 release.

The caveats

The release announcement flags a known problem on macOS 27.0, where IDLE and other tkinter applications may hang when opening dialogs because of an operating system behavior change. The release team suggests that users who depend on Tk-based applications consider deferring the macOS 27.0 upgrade until a workaround is available. The JIT compiler remains experimental, and the performance figures are the project’s own measurements on the platforms named.

Corrections and tips: email the editor using the address on the Contact page.