r/Python 5d ago

News Python 3.15 Release Highlights

Python 3.15 has reached Release Candidate 1, and the final release is expected on October 1, 2026.

I went through the changes and tried to summarize the ones that seem most relevant for everyday Python development without going through all the PEP numbers.

- Faster startup with lazy imports

Python 3.15 introduces lazy imports, which means some modules can be loaded only when they are actually needed instead of being loaded immediately.

This could help applications and CLI tools that spend a noticeable amount of time importing modules before doing any actual work.

- UTF-8 becomes the default

UTF-8 is becoming the default encoding, which should reduce encoding-related problems, especially when code is running on different operating systems.

This should make situations where something works on one computer but fails because of a different system encoding less common.

- Built-in immutable dictionaries

Python 3.15 adds a built-in "frozendict"-style immutable mapping.

Similar to how a tuple provides an immutable alternative to a list, this gives Python developers a standard way to work with dictionaries that cannot be modified.

- JIT improvements

The JIT compiler continues to improve in Python 3.15.

Early benchmarks show performance improvements in some workloads, including roughly 8–9% on Linux and larger improvements in some Apple Silicon tests.

These numbers will obviously depend on the workload, so I would wait for more benchmarks before making broader conclusions.

- New profiler: Tachyon

Python 3.15 also introduces Tachyon, a new sampling profiler designed for very low overhead.

It can sample running programs at very high frequencies and can also be attached to an already-running process.

This could be useful for finding performance problems without having to restart an application with a profiler attached from the beginning.

- Some terminal improvements

The interactive Python experience is getting a few smaller improvements, including colored error messages and prompts.

The "sqlite3" command-line interface also gets SQL keyword completion.

- Free-threaded Python is still opt-in

Python 3.15 does not make the no-GIL/free-threaded build the default.

It is still something you have to explicitly use.

However, free-threaded Python is becoming more mature, including improvements to ABI support that should make it easier for C extension developers to support it.

Overall, Python 3.15 doesn't look like a release that completely changes how Python is written. Most of the changes are focused on performance, tooling, and improving some long-standing parts of the language.

Since this is already RC1, the major feature set should be mostly locked and the remaining work should mainly be bug fixes and final polishing.

Has anyone here been testing the Python 3.15 beta or RC?

I'm especially interested in whether lazy imports have caused compatibility problems with existing projects.

333 Upvotes

72 comments sorted by

View all comments

77

u/bbkane_ 5d ago

sentinel() is also coming!

17

u/gromain 5d ago

What is that?

35

u/JanEric1 5d ago edited 5d ago

Proper repr and stuff for when you need a sentinel value (default so you know if the user passed something in) that can't be None because None is a valid value.

Currently you do that with _SENTINEL = object() and then comparing identity against that. But it has the issue that it has a shitty repr among other things

https://peps.python.org/pep-0661/

6

u/Brian 5d ago edited 4d ago

Currently I do:

class Sentinel:
    value : ClassVar[Sentinel]
Sentinel.value = Sentinel()

def somefunc(val: str | Sentinel = Sentinel.value): ...

Which makes it better for typing (and you can give it a __repr__ if you want). But it'll be nice to have a more standardized way to do it. And one problem with the above is that type checkers don't know it's only one possible value, so they can't narrow types if you do something like:

if val is not Sentinel.value: ....

So you have to use isinstance checks.

1

u/RingularCirc 3d ago

Making this class into a @final Enum with a single value may help with typecheckers (and repr...) but now that we're getting an official way my suggestion is probably only of historic import.

9

u/SCD_minecraft 5d ago

A way of separating "No value" (which commonly was None) from "a value of None"