SciPy Roadmap#

Diese Roadmap-Seite enthält nur die wichtigsten Ideen und Bedürfnisse für SciPy in der Zukunft. Für eine detailliertere Roadmap, einschließlich Status pro Unterpaket, vielen weiteren Ideen, API-Stabilität und mehr, siehe Detaillierte SciPy Roadmap.

Unterstützung für verteilte Arrays und GPU-Arrays#

NumPy hat seine API mit __array_function__ und __array_ufunc__ von seiner Ausführungs-Engine getrennt. Dies wird es Teilen von SciPy ermöglichen, verteilte Arrays (z. B. dask.array.Array) und GPU-Arrays (z. B. cupy.ndarray) zu akzeptieren, die die ndarray Schnittstelle implementieren. Derzeit ist noch nicht klar, welche Algorithmen auf Anhieb funktionieren werden und ob es signifikante Leistungsgewinne gibt, wenn sie es tun. Wir möchten eine Übersicht erstellen, welche Teile der SciPy-API funktionieren, und die Unterstützung im Laufe der Zeit verbessern.

Zusätzlich zur Nutzung von NumPy-Protokollen wie __array_function__ können wir diese Protokolle auch in SciPy nutzen. Dies wird es ermöglichen, SciPy-Funktionen, wie z. B. die in scipy.signal, für Dask- oder GPU-Arrays neu zu implementieren (siehe NEP 18 - use outside of NumPy). Die Funktionen von NumPy in diesem Bereich entwickeln sich noch weiter, siehe z. B. NEP 37 - A dispatch protocol for NumPy-like modules, und SciPy ist ein wichtiger „Kunde“ für diese Funktionen.

Leistungsverbesserungen#

Geschwindigkeitssteigerungen, geringerer Speicherverbrauch und die Möglichkeit, Algorithmen zu parallelisieren, sind für die meisten wissenschaftlichen Domänen und Anwendungsfälle von Vorteil. Wir haben ein API-Designmuster für Multiprocessing etabliert – die Verwendung des Schlüsselworts workers –, das in vielen weiteren Funktionen übernommen werden kann.

Es wäre vorteilhaft, wenn Benutzer Numbas @njit in ihrem auf SciPy-Funktionalität basierenden Code einfacher nutzen könnten, was erhebliche Leistungssteigerungen freischalten würde. Dafür ist jedoch eine Strategie erforderlich, da alle Lösungen noch ausreifen (siehe z. B. diese Übersicht).

Schließlich können viele einzelne Funktionen für die Leistung optimiert werden. Insbesondere Funktionen in scipy.optimize und scipy.interpolate werden in dieser Hinsicht häufig angefragt.

Unterstützung für mehr Hardware-Plattformen#

SciPy verfügt nun über kontinuierliche Integration für ARM64 (oder aarch64) und POWER8/9 (oder ppc64le), und Binärpakete sind über Miniforge verfügbar. Auch Wheels auf PyPI für diese Plattformen sind nun möglich (mit dem manylinux2014-Standard), und Anfragen hierfür werden immer häufiger.

Darüber hinaus ist die Einbindung von IBM Z (oder s390x) in die CI nun mit TravisCI möglich, aber noch nicht umgesetzt – und manylinux2014-Wheels für diese Plattform sind dann ebenfalls möglich. Schließlich würde die Behebung offener AIX-Build-Probleme den Benutzern helfen.

Implementierung von Sparse-Arrays zusätzlich zu Sparse-Matrizen#

SciPy Sparse-Matrizen werden durch Sparse-Arrays ersetzt. Die Sparse-Matrix-Formate sind größtenteils funktionsfähig, ihr Hauptproblem ist jedoch, dass sie sich wie numpy.matrix verhalten (das irgendwann in NumPy als veraltet markiert wird). Was wir wollen, sind Sparse-Arrays, die sich wie numpy.ndarray verhalten (siehe Diskussion unter gh-18915). Sparse-Arrays unterstützen ab Version 1.15 alle Funktionen von Sparse-Matrizen. Zusätzlich zu 2D-Arrays werden 1D Sparse-Arrays in den Formaten DOK, COO und CSR unterstützt. Weitere Funktionalitäten, z. B. Unterstützung für nD-Arrays und Broadcasting für einige Operationen, werden entwickelt. Der zukünftige Plan ist:

  • Erweiterung der Sparse-Array-API auf nD-Arrays
    • COO-, CSR- und DOK-Formate. COO-Format bereits teilweise vorhanden.

    • Die nD-Formate verwenden 2D-CSR-Code, um nD-Operationen wie Indizierung/Min-Max/Arithmetik durchzuführen.

  • Binäre Operationen mit Sparse-Arrays werden in einigen Fällen Broadcasting unterstützen. Broadcasting ist bei Sparse-Arrays knifflig, da es stark auf dem strided memory model von dichten Arrays basiert und daher nicht immer zu Sparse-Datenformaten passt. Unser optimistisches Ziel ist es, Broadcasting für alle Operationen zu unterstützen, bei denen dies für Sparse-Datenstrukturen sinnvoll ist. Wir beginnen mit binären Operationen wie A + B.

  • Unterstützung anderer Bibliotheken bei der Konvertierung von Sparse-Matrizen zu Sparse-Arrays. Erstellung eines Übergangsleitfadens und hilfreicher Skripte zur Kennzeichnung von Code, der geändert werden muss.

  • Markierung und anschließende Entfernung von „Sparse-Matrix“ zugunsten von „Sparse-Array“.

  • Zusammenarbeit mit NumPy an der Markierung/Entfernung von numpy.matrix.