Releasing Python 3.15.0
Python 3.15.0 has officially been released, bringing performance improvements, new built-ins, and lazy imports to the language.
Deep dive
- Lazy imports: Delays the loading of modules until they are actually needed, improving startup time.
- Frozendict: A new immutable dictionary type natively available in the standard library.
- Sentinel: A new built-in for creating unique, singleton sentinel objects easily.
- Tachyon profiler: Integrated tooling to help developers identify performance bottlenecks.
- Performance: Continued optimizations to the JIT compiler and frame pointers for better debugging/tracing.
Decoder
- JIT (Just-In-Time) compiler: A method of execution that compiles code into machine code during runtime rather than ahead of time, often to increase speed.
- Sentinel: An object used in programming to signal the end of a process or a specific, unique condition (e.g., a default value).
Original article
Prologue
Like last year, I livetooted the release of Python 3.15.0. Here it is in blogpost form!
Two weeks
Two weeks until Python 3.15.0 final!
One week
One week until Python 3.15.0 final!!
What are you most looking forward to?
Python 3.15.0 release day!
First blocker, we’re getting 503s on docs.python.org and buildbot.python.org, the latter of which is needed to check the tier 1 and 2 buildbots are passing, needed for a release.
It’s a certificate issue from an incompatible pyOpenSSL upgrade. We’re waiting for the US to wake up and poke it with a stick.
Red
The US woke up and they’re both back up!
Now, there’s one tier 1 failure to check.
Flaky
RuntimeError: join took too long: <Process name='Process-2107' pid=2290504 parent=2276730 started daemon>
Looks like a flaky test, and python/cpython#157184 has a fix to increase a timeout. Will try restarting for now.
Green
That passed, the buildbots are back to green ✅️
Next, issues/PRs with release-blocker label.
One is a straightforward docs update, I marked as blocker so I don’t forget, to change future tense to present.
Then three last-minute lazy import blockers that need a closer look.
Traditional surprise rc3
Following recent tradition, I’m going to add a surprise third release candidate!
It makes sense to include the last-minute lazy-import fixes in 3.15.0 final.
It also makes sense to give time to test them properly, so today’s planned 3.15.0 final is postponed, and I’m going to release a 3.15.0rc3 tomorrow, assuming everything is in place.
And then 3.15.0 final will follow about week later. Exact date to be announced.
We’re nearly there! 🤞
Missing backport
The three lazy blockers are finally merged into main, two have been backported to 3.15, but wait, the third failed, because it depends on some tests not yet backported.
Okay, backport created, merge conflict fixed, CI is now spinning, and automerge enabled. That’ll merge in about 15 mins, then we can update it into the last blocker PR, that should merge about 30 mins later, and rc3 can begin!
rc3
Get yer rc3 here!
You know the drill: please test and report bugs!
Library maintainers, join the Cool Testers’ Club 😎 and add 3.15 to your test matrix.
Python 3.15.0 final planned for 2026-10-09.
Python 3.15.0 release day (second attempt)!
✅️ Release date updated in What’s New in Python 3.15
✅️ No release blockers
✅️ No deferred blockers
✅️ Buildbots all green
Cooldowns
Pydantic finally added support for Python 3.15 yesterday, and aiohttp on Monday, so I could use Python 3.15 rc3 to run the release scripts and release Python 3.15.0 final!
But… I’m going to respect our seven-day cooldown, and stick with 3.14.
You also use cooldowns for your dependencies, right?
blurb bug
Pushing the big launch button:
.venv/bin/python run_release.py --repository ../cpython --ssh-user hugovk --release 3.15.0
… and immediately ran into a bug with our changelog tool blurb, because we’ve had no new NEWS fragments since rc3 :)
This needs a fix in blurb, a new PyPI release, and then the docs lockfile regenerated and backported to 3.15.
Fix PR: python/blurb#92
blurb fix
OK, merged and released (really easy using Trusted Publishing), lockfile updated and backported.
Restarted the release and that’s better now.
A temporary branch and tag has been pushed to my fork, and I need to verify the release commit does not contain any unexpected changes.
All looks good. Next to start the installer and artifact builds.
Installers
The release artifact build failed, need to bump blurb in that lockfile too.
Like this: python/release-tools#451
Now restarted that workflow with the existing CPython tag, no need for retag.
This builds source+docs tarballs and Android+iOS artifacts. Takes ~30 mins.
Ned Deily has started the macOS installer builds. And I’ve started the Windows installer builds, takes ~2 hours.
SBOM
In the meantime, the GitHub Actions build has finished, SBOMs created and some things uploaded.
The Windows process has paused a couple of times, awaiting button clicks to approve signing of binaries. The whole release team gets emails about this, so no sneaking out signed releases. 🥷
Nearly there
Windows complete, tags pushed upstream, Sigstore signing done, adding files to python.org… nearly there…
Out now
🐍🚀 Out now: Python 3.15.0 final!
💤 Lazy imports!
🧊 frozendict builtin!
💂 sentinel builtin!
📉 Tachyon profiler!
🖼️ Frame pointers everywhere!
🛅 Unpacking in comprehensions!
🗣️ UTF-8 as the default encoding!
🛞 Stable ABI for free-threading!
🆕 Package startup config files!
⌨️ TypedDict & TypeForm!
🐎 Faster JIT!
🎨 More colour!
🚌 & more!
Huge thanks to the Sovereign Tech Agency supporting my work as release manager and enabling another smooth release!
It’s not over yet!
I updated PEP 790, which also updates the PEPs API, which is used to point the docs at /3/ to 3.15, kicked off a docs build: docs.python.org/3/
Unpin one toot and pin another to my profile.
(3.14 might not be the newest, but we can still celebrate with pie!)
And then unlock the 3.15 branch so the core team can start merging 185 PRs that didn’t get in during RC.
Also
✅️ update 3.15 label
✅️ rebuild devguide to update: devguide.python.org/versions/
✅️ unlock 3.15 branch
And I think that’s it!
Hey, @savannah, you’re up next with the first 3.16 alpha on Tuesday! 🚀
Fresh dev news, AI-digested daily. Never miss a trend at devoured.fyi