Python 3.15 Is Here and Python 3.10 Is Dead — Your Upgrade Guide
Python 3.15.0 shipped on October 9 while Python 3.10 reached end of life on October 1. Here's what's new, what will break, and how to plan your move off the dead version.
Python 3.15.0 shipped on October 9, and Python 3.10 reached end of life on October 1. That's the whole story in two sentences — and if your production stack still runs 3.10, you're now operating without security patches. The Python 3.15 upgrade isn't just about new features; it's the exit ramp off a version the core team no longer fixes.
Goodbye, 3.10: the clock has run out
Python 3.10 went end of life on October 1, 2026. From here on: no security updates, no bug fixes, nothing. The ecosystem isn't waiting for stragglers — numpy and the Scientific Python SPEC 0 policy already require 3.11 or newer, and package maintainers are dropping 3.10 from their build matrices this month. One sign of the times: the satkit project just merged a change adding cp315 wheels and removing 3.10 entirely.
Python 3.11 follows in October 2027, so if you're doing the bare minimum, 3.11 buys you one more year. But a single year of support is a short runway. Plan for 3.12 at minimum — it's supported through October 2028, and it's the version the ecosystem has fully adopted.
What's actually new this time
This is a practical release, not a flashy one. The headline feature is lazy imports: modules load only when first used, which cuts startup time for large applications and CLIs. If your app feels sluggish to start, this alone is worth the upgrade.
The experimental JIT keeps improving — roughly 7 to 8 percent faster than the standard interpreter on the pyperformance suite, though it's still off by default and still experimental. Also new: the Tachyon sampling profiler (PEP 799), which attaches to a running program without code changes or restarts, and a smarter asyncio scheduler that drops the implicit global event loop in favor of per-loop queues. ARM64 gets tighter C-API paths too, which matters if you run on Graviton or other ARM cloud instances.
Then the quiet breaking change: UTF-8 is now the default encoding for open(), compile(), and ast.parse() regardless of system locale. On Linux and macOS you probably won't notice. On Windows machines with a non-UTF-8 locale, code that relied on the old default will silently read and write files differently.
The three things that will break
Before you upgrade anything, grep for these:
- Locale-dependent file I/O. Any open() call without an explicit encoding= argument is now UTF-8 everywhere. Adding explicit encodings is mechanical work — do it now.
- Long-deprecated removals. module.cached is gone (use spec.cached), locale.getdefaultlocale() is finally removed (use locale.getencoding()), and import statements in .pth files no longer work.
- CGI in http.server. It's deprecated. If anything you maintain still serves through it, that's a rewrite you should have done years ago — consider this your deadline.
The fastest way to surface problems: run your test suite under python -W error so deprecation warnings become errors. Do it on your current version first; the warnings tell you exactly what's coming.
The Python 3.15 upgrade checklist
Here's the order that wastes the least time:
- Run your full test suite with warnings-as-errors on your current version first.
- Add explicit encoding= to every file open call.
- Fix the three removals listed above.
- Update your CI matrix: drop 3.10, add 3.15, keep 3.11 as your floor.
- If you ship compiled extensions, build wheels against the frozen ABI and publish 3.15 support on day one — the ABI has been frozen since the release candidates.
The mechanical fixes — encoding arguments, renamed attributes — are exactly the kind of grind AI coding agents are good at. Point one at your repo with a clear checklist and review the diff.
Should you jump to 3.15 or stop at 3.12?
Opinion: if you're still on 3.10, get to 3.12 first and stabilize. It's supported until October 2028, the whole ecosystem builds for it, and it avoids the newest edge cases. Then take 3.15 once your dependencies ship wheels for it — most already do, since the ABI froze months before release.
But don't sit on 3.10 a day longer. An unsupported interpreter running production workloads is a known risk with a known fix. Python remains the default language for data work, web backends, and the entire AI experimentation stack — the version you run is infrastructure, and infrastructure has an expiration date.


