Python 3.15 im Detail: Explizite Lazy Imports und natives frozendict bringen spürbaren Leistungsschub

Python · Release 3.15

Python 3.15 im Detail: Explizite Lazy Imports und natives frozendict bringen spürbaren Leistungsschub

pythonPythonReleaseLazy ImportsfrozendictLeistungsoptimierung

Quellen:GitHub Releases + 官方博客 + HN

Python 3.15 wurde am 9. Oktober 2026 offiziell veröffentlicht. Dieses Release bringt bemerkenswerte Weiterentwicklungen auf Sprachebene sowie umfassende Performance-Optimierungen mit sich. Explizite Lazy Imports (PEP 810) lösen das Problem träger Startzeiten großer Anwendungen, die Einführung von frozendict schließt die langjährige Lücke für unveränderliche Mappings, Unpacking in Comprehensions gestaltet Datentransformationen deutlich eleganter und eine stabile ABI für Free-Threaded-Builds beschleunigt Pythons Weg in eine vollwertige Multi-Threading-Zukunft. Im Folgenden analysieren wir die wichtigsten Kernfunktionen dieser Version.

PEP 810: Explizite Lazy Imports

Große Python-Anwendungen leiden häufig unter langen Startzeiten, was größtenteils auf kaskadierende Modul-Imports zurückzuführen ist. In der Vergangenheit behalfen sich Entwickler damit, Import-Anweisungen in Funktionsrümpfe zu verlagern oder Module über importlib bedarfsgesteuert zu laden. Python 3.15 bietet nun eine deutlich elegantere native Lösung: explizite Lazy Imports über das weiche Schlüsselwort lazy.

Wird lazy import verwendet, lädt Python das Modul nicht sofort, sondern erzeugt ein leichtgewichtiges Proxy-Objekt. Erst wenn zum ersten Mal auf ein Attribut oder einen Namen des Moduls zugegriffen wird, wird der tatsächliche Ladevorgang ausgeführt.

lazy import json
lazy from pathlib import Path

print("Starting up...")  # json und pathlib sind noch nicht vollständig importiert

data = json.loads('{"key": "value"}')  # Erst bei diesem Zugriff wird json vollständig importiert
p = Path(".")  # Erst bei diesem Zugriff wird pathlib vollständig importiert

Sollte ein verzögert importiertes Modul nicht existieren, wird die entsprechende Ausnahme erst beim ersten Zugriff ausgelöst. Entwickler können das Verhalten für Lazy Imports zudem global über die Umgebungsvariable PYTHON_LAZY_IMPORTS oder die Befehlszeilenoption -X lazy_imports steuern.

PEP 814: Neuer integrierter Typ frozendict

Mit Python 3.15 wird der neue unveränderliche Typ frozendict direkt in die Sprache integriert. Er erbt direkt von object und ist keine Unterklasse von dict. Solange alle Schlüssel und Werte hashbar sind, ist auch das frozendict selbst hashbar. Ein frozendict behält die Einfügereihenfolge bei, ignoriert diese jedoch bei Gleichheitsvergleichen (==).

Die Einführung vereinfacht den Umgang mit unveränderlichen Mappings erheblich – insbesondere dann, wenn Mappings als Schlüssel in Dictionaries oder als Elemente in Sets verwendet werden sollen.

>>> a = frozendict(x=1, y=2)
>>> a
frozendict({'x': 1, 'y': 2})
>>> a['z'] = 3
Traceback (most recent call last):
  File "<python-input-2>", line 1, in <module>
    a['z'] = 3
    ~^^^^^
TypeError: 'frozendict' object does not support item assignment
>>> b = frozendict(y=2, x=1)
>>> hash(a) == hash(b)
True
>>> a == b
True

PEP 798: Entpacken in Comprehensions (Unpacking in comprehensions)

List-, Set- und Dictionary-Comprehensions sowie Generator-Ausdrücke unterstützen nun das Entpacken mittels * und **. Dies ist eine natürliche Erweiterung der mit PEP 448 eingeführten Unpacking-Syntax. Das Zusammenführen mehrerer Iterables oder Dictionaries zu einer flachen Struktur wird dadurch stark vereinfacht und dient als direkter Ersatz für verschachtelte Comprehensions oder itertools.chain().

>>> lists = [[1, 2], [3, 4], [5]]
>>> [*L for L in lists]  # Entspricht [x for L in lists for x in L]
[1, 2, 3, 4, 5]

>>> sets = [{1, 2}, {2, 3}, {3, 4}]
>>> {*s for s in sets}  # Entspricht {x for s in sets for x in s}
{1, 2, 3, 4}

>>> dicts = [{'a': 1}, {'b': 2}, {'a': 3}]
>>> {**d for d in dicts}  # Entspricht {k: v for d in dicts for k,v in d.items()}
{'a': 3, 'b': 2}

Dasselbe Verhalten gilt für Generator-Ausdrücke:

>>> gen = (*L for L in lists)  # Entspricht (x for L in lists for x in L)
>>> list(gen)
[1, 2, 3, 4, 5]

PEP 661: Neuer integrierter Typ sentinel

Python 3.15 ergänzt das Modul builtins um den Typ sentinel, der die standardisierte Erstellung eindeutiger Sentinel-Werte mit lesbarer Darstellung ermöglicht. Sentinel-Objekte behalten ihre Identität auch bei Kopieroperationen, unterstützen den Union-Operator | in Typausdrücken und lassen sich per pickle serialisieren, sofern sie über Modul und Namen importierbar sind.

PEP 803: Stabile ABI für Free-Threaded-Builds (abi3t)

Für Free-Threaded-Builds von Python können C-Erweiterungen nun gegen eine dedizierte stabile ABI namens abi3t kompiliert werden. Die Umstellung erfordert Anpassungen am Quellcode, darunter die Migration auf die in PEP 697 definierten APIs sowie die Nutzung des mit PEP 793 eingeführten Modul-Export-Hooks PyModExport_*.

Erweiterungen, die noch nicht auf abi3t migriert werden können, sollten weiterhin separate Builds für die bisherige stabile ABI (abi3) und die versionsspezifische Free-Threaded-ABI (cp315t) bereitstellen.

Upgrade-Empfehlungen und Hinweise

DimensionDetails
Wer sollte upgradenEntwickler großer Anwendungen mit hohen Anforderungen an die Startzeit; Entwickler, die regelmäßig komplexe Dictionary-Merges durchführen; Maintainer von Bibliotheken, die C-Erweiterungen an Free-Threading anpassen.
Wann upgradenIn lokalen Entwicklungs- und Testumgebungen kann Python 3.15 ab sofort erprobt werden. Für Produktivumgebungen empfiehlt sich die Migration erst, sobald kritische Abhängigkeiten (insbesondere C-Erweiterungen) für abi3t oder cp315t bereitstehen.
Wichtige Hinweise• Tracing-Funktionen aus cProfile wurden in das neue profiling-Modul integriert (PEP 799).
• Das bisherige profile-Modul ist als veraltet markiert und wird in Python 3.17 entfernt.
• import-Zeilen in .pth-Dateien sind stillschweigend veraltet; die Migration auf .start-Konfigurationsdateien wird empfohlen (PEP 829).
• Die PyGILState-APIs sind soft-deprecated; neue APIs dieser Familie werden nicht mehr hinzugefügt (PEP 788).

Referenzen und Quellen