Python 3.15 Ships a Stable Free-Threaded ABI and Opt-In Lazy Imports

The Python Software Foundation's October 9, 2026 release lets one compiled extension wheel target both the normal and no-GIL interpreter, and lets startup-heavy scripts defer imports on request.

EduFabTech · 15 October 2026 · 4 min read · 0 views
An abi3t wheel splitting into two paths — standard CPython and the free-threaded no-GIL build — illustrates how one compiled extension now targets both interpreters.
EduFabTech · Own work

The Python Software Foundation released Python 3.15.0 on October 9, 2026, the project's main annual update, according to the official announcement on the Python Insider blog. The release folds in 5,643 commits from 1,012 contributors, the same announcement says, and its headline changes touch how C extensions are packaged, how scripts start up, and how text is decoded by default.

A free-threaded build the ecosystem can finally compile once for

The most consequential change for the scientific and data-processing world is a stable Application Binary Interface for free-threaded builds, tracked as PEP 803, 793 and 820 in the official "What's New in Python 3.15" document. Since Python 3.13, CPython has offered an experimental build that removes the Global Interpreter Lock so threads can run Python bytecode on separate CPU cores at once, but extension authors had to compile and ship separate binaries for the normal interpreter and the no-GIL one. PEP 803, as described on peps.python.org, adds a new ABI variant, abi3t, that is compatible with the existing Stable ABI, so a library can target both interpreter variants from a single compiled wheel once it adopts the newer C API hooks from PEP 697 and PEP 793.

The practical sign of that shift: official macOS installers now set up free-threading support by default, the "What's New" document notes, and build tools including meson-python, scikit-build-core and Maturin already support the abi3t target. That lowers the packaging burden for exactly the kind of compiled libraries — array and image processing code, cryptography bindings — that data-science and research pipelines depend on, though adoption still rests on each extension's maintainers choosing to recompile against the new ABI.

A three-stage diagram shows how PEP 803/793/820 move the ecosystem from separate binary wheels per interpreter to a single abi3t wheel that works with both.
A three-stage diagram shows how PEP 803/793/820 move the ecosystem from separate binary wheels per interpreter to a single abi3t wheel that works with both.EduFabTech · Own work

Lazy imports become an explicit, opt-in keyword

Python 3.15 also implements PEP 810, which adds a soft lazy keyword: writing lazy import json defers loading the module until the first line of code actually touches it, rather than at the top of the file. The feature is opt-in — ordinary import statements still load eagerly by default — and can also be switched on globally with a command-line flag or the PYTHON_LAZY_IMPORTS environment variable, per the "What's New" page. The PEP's own benchmark, described on peps.python.org, found that running a lazy-import filter over 278 standard-library modules (392 counting dependencies) added only 0.3% overhead compared with eager imports — 161.7 milliseconds against a 161.2-millisecond baseline — while citing production reports from Meta's Instagram server and from Hudson River Trading's internal Python fork of larger startup-time savings at scale.

Smaller changes with a wide footprint

Several lower-profile changes affect nearly every Python program. PEP 686 makes UTF-8 the default text encoding for file I/O instead of the operating system's locale encoding, closing a long-standing source of bugs when code written on one operating system is run on another — developers who need the old behavior can request it explicitly with encoding='locale'. The release also adds two new built-in types: an immutable, hashable frozendict (PEP 814) and a sentinel type for unique placeholder values (PEP 661), both detailed in the official documentation.

For engineers who maintain long-running services, the release adds a new profiling package built around Tachyon, a statistical sampling profiler under PEP 799 that can attach to a running process by its process ID with no code changes and sample at rates up to 1,000,000 Hz, producing flamegraphs and other visual outputs. The experimental JIT compiler, separately, now delivers a 7-8% geometric-mean performance improvement on x86-64 Linux and 11-12% on AArch64 macOS compared with the standard interpreter, the "What's New" document states — figures that the independent outlet Linuxiac repeated in its own release coverage on October 10, 2026.

A bar chart compares the experimental JIT's speedup on x86-64 Linux (7-8%) versus AArch64 macOS (11-12%), alongside stat cards on the new Tachyon profiler's 1,000,000 Hz sampling rate and lazy imports' 0.3% overhead.
A bar chart compares the experimental JIT's speedup on x86-64 Linux (7-8%) versus AArch64 macOS (11-12%), alongside stat cards on the new Tachyon profiler's 1,000,000 Hz sampling rate and lazy imports' 0.3% overhead.EduFabTech · Own work

What it means for students and researchers

For anyone writing numerical or data-processing code, the stable free-threaded ABI matters more than any single benchmark number: it is the step that lets maintainers of libraries such as array, image and cryptography bindings ship one build that works whether or not the GIL is disabled, instead of maintaining parallel binaries. That is a precondition for research groups and students to use true multi-core threading for CPU-bound Python work — simulations, data cleaning, batch inference — without reaching for multiprocessing or external schedulers, once the libraries they depend on recompile against abi3t.

The UTF-8 default also closes a quiet but common source of irreproducible results: code shared between collaborators on Windows, Linux and macOS that reads text files without specifying an encoding has historically picked up whatever the local operating system assumed, occasionally corrupting non-ASCII data silently. Lazy imports, meanwhile, mainly help command-line research tools and notebook kernels that import large dependency graphs at startup but only use a fraction of them in a given run. None of these changes require upgrading existing code immediately — Python 3.15 remains backward compatible with the 3.14 language, per the official release notes — but libraries and courses that teach concurrent or parallel Python will need to account for the free-threaded build as it moves from a niche option toward a standard target.

A quick question for readers

Comments 0

Comment

No comments yet. Members start the conversation.

Source: Python Software Foundation

Sources (3)
  1. Python Software Foundation. Python 3.15.0 final is here!. Python Insider (blog.python.org), 2026. blog.python.org ↗ · checked 15 Oct 2026
  2. Python core developers. What's New In Python 3.15. Python 3.15.0 documentation, 2026. docs.python.org ↗ · checked 15 Oct 2026
  3. Bobby Borisov. Python 3.15 Released With Faster JIT, Lazy Imports, and UTF-8 by Default. Linuxiac, 2026. linuxiac.com ↗ · checked 15 Oct 2026