📊 See open-source project rankings

📱 Get the AI Rank app

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.

📱 Follow rankings in the AI Rank app

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 from cProfile; cProfile remains 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 with PYTHONUTF8=0 or -X utf8=0. Prefer an explicit encoding= 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.connect parameters other than database are keyword-only; several Connection methods tightened positional/keyword rules
  • resource.RLIM_INFINITY is always positive; negative stand-ins for the old infinity value are deprecated
  • mmap.mmap.resize removed on platforms without the underlying syscall (previously raised SystemError)
  • Unclosed xml.etree.ElementTree.iterparse iterators that opened a file emit a resource warning—close them
  • argparse dest inference when mixing a short option with a single-dash long option (for example -f / -foo) now follows the long form unless you pass explicit dest
  • base64.urlsafe_b64decode no longer requires padding by default (padded=True restores the old requirement)
  • unittest.TestCase.assertWarns / assertWarnsRegex no 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

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.