Python 3.15 changes four defaults, starting with UTF-8 as the text encoding
Python 3.15 makes UTF-8 its default encoding and ships an experimental JIT 7-8% faster by geometric mean on x86-64 Linux. Each platform's JIT figure uses a different baseline, so a service learns what the JIT does for it only by rerunning the test.
The Engineer · Build desk

Four rows. Text handling: UTF-8 is now the default encoding under PEP 686. System-level observability: frame pointers are enabled by default under PEP 831. Windows 64-bit binaries: now use the tail-calling interpreter. macOS binaries: now install free-threading support by default.
- Who has to decide decision Text encoding UTF-8 is now the default encoding under PEP 686., claim 1
- What's now possible capability System-level observability Frame pointers are enabled by default under PEP 831 for improved system-level observability., claim 7
- Who's exposed exposure Windows 64-bit binary users Official binaries now use the tail-calling interpreter., claim 8
- Who's exposed exposure macOS binary installs Official binaries now install free-threading support by default., claim 9
| Who | How | Kind | Claim |
|---|---|---|---|
| Text encoding | UTF-8 is now the default encoding under PEP 686. | decision | 1 |
| System-level observability | Frame pointers are enabled by default under PEP 831 for improved system-level observability. | capability | 7 |
| Windows 64-bit binary users | Official binaries now use the tail-calling interpreter. | exposure | 8 |
| macOS binary installs | Official binaries now install free-threading support by default. | exposure | 9 |
What happened
- On AArch64 macOS the release notes put the JIT 11-12% ahead, measured against the tail-calling interpreter instead of the standard interpreter used for the Linux figure.
- PEP 810 brings explicit lazy imports to Python 3.15, aimed at shorter startup times.
- Frame pointers are now enabled by default under PEP 831, for better system-level observability.
- The official Windows 64-bit binaries now use the tail-calling interpreter.
- The official macOS binaries now install free-threading support by default.
Why it matters
- Who has to decide decision Every text path that relied on the old default now forces a choice between naming an encoding in code and accepting UTF-8.
- What it limits constraint Startup gains from PEP 810 depend on marking imports in code, so moving to the 3.15 interpreter alone should not shorten cold starts.
- What it costs cost Crediting a 3.15 speedup to the JIT, or a slowdown to frame pointers, takes separate benchmark runs with each default isolated.
- What's now possible capability Stock 3.15 builds can be examined with system-level tools without rebuilding Python with frame pointers turned on.
Next story · Build · 4d ago
Dropping Python 3.10 gives library authors 3.11 features but leaves lazy imports out of reachOne report1 publisher
A default only reaches code that leaves the choice open. Under PEP 686, a path that reads or writes text without naming an encoding now gets UTF-8 [1]. Those call sites look the same before and after the upgrade, so a diff review will not find them. I'd search for them before the first 3.15 deploy, starting with file handling that has never had to say what encoding it expected.
PEP 810 works the other way. Taken literally, "explicit" means the startup saving goes only to imports that are marked for it [4]. Existing import statements should behave as they did on 3.14. The test work arrives with the edit that marks them, one module at a time.
The JIT figures are the release team's own [2][3]. The announcement does not name the benchmark suite behind either geometric mean. A geometric mean can also hold benchmarks that slowed down alongside ones that sped up a lot. For the Linux figure to transfer, a service's hot paths have to look like that suite, and it has to run on x86-64 Linux [2]. Its operators also have to accept a compiler that the release notes and Phoronix both still call experimental [6][10].
A plain before-and-after benchmark measures more than the JIT. Add the encoding change to the three build and release defaults above and the release highlights list four default changes between 3.14 and 3.15 [14]. A team timing a Windows service on 3.14 and again on 3.15 gets one number that covers a different interpreter build [8], frame pointers [7] and the new encoding [1].
The frame-pointer default is the change I'd defend hardest. PEP 799 lands in the same release with a dedicated profiling package and Tachyon, a high-frequency statistical sampling profiler [5]. The default gives system-level tools a view of the interpreter [7], and the standard library now has a sampler for the Python side [5].
Barry Warsaw marked the release with whatsnewt, a text adventure for the terminal [11]. "I had this idea to whip up a little TUI adventure game that takes you through a What's New in Python 3.15," he wrote [11]. Each of its eighteen puzzles requires a real 3.15 feature, with the code written and run in a 3.15 interpreter [12]. It is also a cheap way to put code in front of 3.15 before the CI matrix has one: `uvx --python 3.15 whatsnewt` [13].
What to watch
- Independent JIT benchmarks on production-shaped workloads, especially on Windows, where the official binaries changed interpreter in the same release.
- Whether a later release drops the JIT's experimental label and makes the 7-8% figure apply to the default execution path.
- Encoding regressions filed against 3.15 by projects whose file handling never named an encoding.
Clarity's read
What the record supports and how the coverage leans. The claims behind it follow.
Reality
- Evidence72
- Adoption
- Not scored
- Hype gap+15
- Incentives20
- Confidence70
Perspective Coverage
5 publishers- Builder
- Builder 57%
- Operator
- Operator 37%
- Investor
- Investor 6%
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
Under PEP 686, Python 3.15 uses UTF-8 as the default encoding.
- [2]
The experimental JIT compiler in Python 3.15 shows a 7-8% geometric mean performance improvement on x86-64 Linux over the standard interpreter.
- [3]
The Python 3.15 JIT shows an 11-12% speedup on AArch64 macOS over the tail-calling interpreter.
- [4]
PEP 810 adds explicit lazy imports for faster startup times in Python 3.15.
- [5]
PEP 799 adds a dedicated profiling package for organizing Python profiling tools, including Tachyon, a high frequency statistical sampling profiler.
- [6]
The release notes describe the JIT as 'the experimental JIT compiler', which has been significantly upgraded in 3.15.
- [7]
Under PEP 831, frame pointers are enabled by default in Python 3.15 for improved system-level observability.
- [8]
The official Windows 64-bit binaries of Python 3.15 now use the tail-calling interpreter.
- [9]
The official macOS binaries of Python 3.15 now install free-threading support by default.
- [10]
Python's JIT compiler is still in experimental form, though it is a lot faster with Python 3.15.
- [11]
I had this idea to whip up a little TUI adventure game that takes you through a What's New in Python 3.15.
- [12]
whatsnewt has eighteen puzzles, each a real 3.15 feature the player has to use, writing and running code in a Python 3.15 interpreter.
- [13]
The easiest way to play whatsnewt is to run: uvx --python 3.15 whatsnewt
- [14]
The Python 3.15 release highlights list four default changes: UTF-8 default encoding, frame pointers on by default, the tail-calling interpreter in official Windows 64-bit binaries, and free-threading support installed by default with official macOS binaries.
Sources
4 independent publishers whose own reporting we read for this story.
- blog.python.orgPython 3.15.0 (final) is here!
1 article · October 8, 2026
- dev.toPython 3.15.0 ships with lazy imports and frozendict
2 articles · October 9, 2026
- lwn.netPython 3.15 released
1 article · October 9, 2026
- phoronix.comPython 3.15 Released With Experimental JIT Compiler Running Faster
1 article · October 9, 2026
- runtimewire.comPython 3.15 ships lazy imports, an upgraded JIT and free-threading support
1 article · October 9, 2026
Topics and entities
Topics
Entities
- Python
- Python Software Foundation
- Hugo van Kemenade
- python/cpython
- Sovereign Tech Agency