Python 3.15 is out, and its headline changes go after two of the language's oldest annoyances at once, according to heise: how long a program takes to start, and which encoding it assumes when it opens a file.
The first is lazy imports — a mechanism that defers a module's loading until the first time something inside it is actually used. Python has historically imported eagerly: an `import` at the top of a file pulls in the entire module graph before anything runs, which is why a small script that imports one function from a heavy library can spend its first hundred milliseconds doing work it never needs. Lazy imports push that cost to the point of use. For command-line tools, server cold starts and large applications, the startup improvement is real rather than cosmetic.
The second is UTF-8 as the default mode. This is the long-debated change formalised as PEP 686, and it settles a decade of friction rooted in the Windows era. Until now, Python's default text encoding followed the locale, so the same code could read a file as UTF-8 on a Linux server and as something else on a Windows machine, producing mojibake in files that looked perfectly fine to their author. UTF-8 by default removes a class of bugs that developers have been trained to work around rather than to reason about.
The third change is a set of new data types, which — depending on how they are adopted — may prove the most durable of the three, because types become interfaces: once a type is in the standard library, it spreads through libraries, type stubs and APIs.
The release lands on Python's annual cadence, which has turned October into a fixture of the developer calendar, and it is the first to ship since Python 3.10 reached end of life. That overlap is worth noting for anyone maintaining older services: the same month that brought new features also withdrew support from code that plenty of production systems still run.
For most teams, the practical question is not whether to adopt 3.15 but when. Lazy imports and UTF-8-by-default are the kind of changes that are invisible until they are not: a large test suite is the safest way to find the places where an implicit encoding assumption was load-bearing. As always, the authoritative detail is in the release notes and the What's New document, which remain the source of truth for behaviour changes that tooling may not catch.




