Python 3.15 is the current stable release line on python.org/downloads. According to the official download page and What’s New in Python 3.15, Python 3.15.0 shipped on 9 October 2026 and python 3.15.1 on 21 October 2026. The series is in bugfix status, with end of support listed as October 2031 (PEP 790).
The What’s New overview calls out lazy imports, frozendict and sentinel builtins, UTF-8 as the default encoding, unpacking in comprehensions, a stable ABI for free-threaded builds, and a new profiling package that includes Tachyon. For upgrade work, the same document has a dedicated Porting to Python 3.15 section.
Release dates for Python 3.15 and python 3.15.1
From python.org/downloads (checked against the What’s New intro):
- 3.15.0 — 9 October 2026 (first stable in the line)
- 3.15.1 — 21 October 2026 (current patch on the listing at publish time)
- Maintenance: bugfix; support through October 2031 (PEP 790)
Download installers and source from the official downloads page rather than third-party mirrors when you need a verified build.
→ Open-source ranking: Browse open-source projects on AI Rank.
PEP 810 lazy imports
PEP 810 adds an explicit lazy soft keyword so imports can stay at module top while loading is deferred until first use:
lazy import json
lazy from pathlib import Path
print("Starting up...") # modules not fully loaded yet
data = json.loads('{"key": "value"}') # json loads here
What’s New documents these limits: lazy is only allowed at module scope (not inside functions, classes, or try/except/finally); star imports and __future__ imports cannot be lazy. Global switches exist as -X lazy_imports=all|normal and PYTHON_LAZY_IMPORTS, plus sys.set_lazy_imports() / sys.set_lazy_imports_filter(). Modules can also list names in __lazy_modules__ so plain import statements for those names behave as lazy—useful when you still support older Pythons.
PEP 814 frozendict
PEP 814 adds builtin frozendict: immutable after creation, not a dict subclass, hashable when keys and values are hashable, insertion order preserved for display but ignored in equality. Assignment raises TypeError.
Standard library modules updated to accept it include copy, decimal, json, marshal, pickle, pprint, and others listed in What’s New. Code that uses isinstance(arg, dict) will miss frozendict; the docs suggest (dict, frozendict) or collections.abc.Mapping.
Tachyon and the profiling package
PEP 799 introduces the profiling package:
profiling.tracing— deterministic call tracing (relocated fromcProfile;cProfileremains an alias)profiling.sampling— Tachyon, a statistical sampling profiler
What’s New describes Tachyon as attachable by PID without restarting the process, with modes such as wall / CPU / GIL / exception time, outputs including flame graphs and collapsed stacks, live TUI (--live), and async-aware options. The older profile module is deprecated and scheduled for removal in 3.17.
Other language and runtime notes worth knowing
- UTF-8 default encoding (PEP 686):
open()without an encoding uses UTF-8. Opt out withPYTHONUTF8=0or-X utf8=0. Prefer an explicitencoding=for cross-version clarity. - Unpacking in comprehensions (PEP 798):
[*L for L in lists]and{**d for d in dicts}flatten iterables or mappings. - Sentinel builtin (PEP 661): concise unique sentinel values.
- Garbage collector: What’s New states the incremental GC shipped in early 3.14 was reverted; 3.15 uses the generational GC again (same as 3.14.5+).
- Official Windows 64-bit binaries use the tail-calling interpreter; official macOS binaries install free-threading support by default.
Porting to Python 3.15
The Porting to Python 3.15 section lists concrete breakages and API cleanups, including:
sqlite3.connectparameters other thandatabaseare keyword-only; severalConnectionmethods tightened positional/keyword rulesresource.RLIM_INFINITYis always positive; negative stand-ins for the old infinity value are deprecatedmmap.mmap.resizeremoved on platforms without the underlying syscall (previously raisedSystemError)- Unclosed
xml.etree.ElementTree.iterparseiterators that opened a file emit a resource warning—close them argparsedest inference when mixing a short option with a single-dash long option (for example-f/-foo) now follows the long form unless you pass explicitdestbase64.urlsafe_b64decodeno longer requires padding by default (padded=Truerestores the old requirement)unittest.TestCase.assertWarns/assertWarnsRegexno longer swallow unmatched warnings—tests may start showing previously hidden warnings
Separately from that bullet list, plan for UTF-8-by-default I/O, frozendict in isinstance checks, and migration from profile / raw cProfile toward profiling.* when you touch profiling code.
Sources
- What’s New in Python 3.15 (docs for 3.15.1)
- Porting to Python 3.15
- Python downloads
- PEP 790 — Python 3.15 release schedule
- PEP 810 — Explicit lazy imports
- PEP 814 — frozendict
- PEP 799 — profiling package
- PEP 686 — UTF-8 mode default
Keep exploring: see rising projects on the open-source ranking on AI Rank.
Or 📱 get the AI Rank app to follow them on your phone.
Prepared with automated editorial assistance and checked against docs.python.org What’s New in Python 3.15 and python.org/downloads on October 24, 2026. We did not run our own benchmarks on 3.15 for this article.