Windows-SciPy-Builds für Python 3.12 gelten als kleines Wunder
(labs.quansight.org)- Die SciPy-Windows-Builds von conda-forge standen bereits zwei Tage nach der Veröffentlichung von Python 3.12.0 bereit, sodass die Python-3.12-Migration im SciPy-Ökosystem nicht monatelang blockiert war, sondern sich nur um wenige Tage verzögerte
- Mit der Entfernung von distutils aus der Standardbibliothek in Python 3.12 entschied sich SciPy, vom
numpy.distutils-Ansatz auf das Build-Tool Meson zu wechseln - Meson würde die von conda-forge verwendete Kombination aus MSVC+gfortran voraussichtlich ablehnen, und unter Windows gab es keinen freien ABI-kompatiblen Fortran-Compiler, den conda-forge nutzen konnte
- conda-forge erwartete, dass bei einem Scheitern des SciPy-Neuaufbaus unter Windows die Migration von mindestens etwa 1.000 SciPy-abhängigen Paketen auf allen Plattformen verzögert würde oder Windows bei der Python-Migration ausgeschlossen werden müsste
- LLVM 17.0 war die erste Veröffentlichung, in der Flang das Flag
-flang-experimental-execentfernte, und Flang wurde auf einen Reifegrad von „0.8 level maturity“ geschätzt - Nach dem Hinzufügen der llvm-flang-Behandlung in Meson gelang der Build und die Installation von SciPy; die Tests bestanden mit
54,987 passed,2,866 skipped,245 xfailed,11 xpassed,1 warningzu 100 % {p:100}
3 Kommentare
Hacker-News-Kommentare
Ein wirklich großartiger Artikel, und jetzt ist mir klar, warum
pip installunter Python 3.12 gescheitert ist, aber die Zukunft wirkt heller.Ich mag Python, und es hat auch geholfen zu verstehen, warum Python-Paketierung ein beherrschbares Chaos ist.
Die Ursache liegt nicht bei Python selbst, sondern in der fehlenden Standardisierung der Build-Tools für C/C++/Fortran und in der enormen Größe des Ökosystems; ein Teil dieser Komplexität ist wohl unvermeidbar.
Dass das überhaupt funktioniert, grenzt an ein Wunder.
Der Erfolg von Python beruht zu einem großen Teil darauf, dass man zentrale gemischtsprachige Pakete nutzen konnte, und andere Mainstream-Sprachen mit Paketmanagern müssen sich mit diesem Problem kaum befassen.
Rusts
cargoist zum Beispiel großartig, kann aber meist davon ausgehen, dass es um die Paketierung von reinem Rust-Code geht, und weil es eine kompilierte Sprache ist, die ihren Compiler selbst „besitzt“, funktioniert eine Distributionsstrategie mit Source-Builds.Ich weiß nicht, wie
cargostandardmäßig mit Fortran umgeht, aber wenn unter Windows wichtigecargo-Pakete Fortran-Code benötigen würden, dürfte das kaum reibungslos funktionieren.Die größte Verbesserung im Python-Ökosystem war die Standardisierung des binären Paketformats wheel; erst dann begann das wissenschaftliche Python-Ökosystem unter Windows wirklich aufzublühen.
Binärkompatibilität ist allerdings ein gewaltiger Problemfall, besonders wenn man sprach- und CPU-übergreifend arbeitet.
Die Komplexität von Software-Ökosystemen scheint exponentiell zu wachsen, und ich frage mich, was am Ende verhindert, dass es zu einem babylonischen Kollaps kommt.
Das gilt natürlich nicht nur für Software, ist aber ein gutes Beispiel.
Ich sehe oft, dass Leute ihren bevorzugten Paketmanager mit dem von Python vergleichen und dann zu dem Schluss kommen, Python sei miserabel, aber in Wirklichkeit ist das nicht so.
Was ich allerdings nicht ganz verstehe, ist, warum die Python-Leute statt Fortran nicht mathematische C/C++-Bibliotheken verwenden.
So stapelt sich Chaos auf noch mehr Chaos.
Als Linux ein holpriger Randfall war, lose koordiniert von Hackern, die manchmal unter unpraktischen ideologischen Zwängen arbeiteten, war es fantastisch, wie brillante Leute enorm viel Mühe investierten, um Unterstützung dafür bereitzustellen.
Aber jetzt ist dieser holprige Randfall ein proprietäres System geworden, dessen Einschränkungen fast schon feindselig wirken und das von Cyber-Feudalherren betrieben wird; deshalb fällt es mir schwerer, die Arbeit zu seiner Unterstützung noch so positiv zu sehen wie früher.
Andererseits ist diese tiefe Fürsorge dafür, solche Werkzeuge für alle zugänglich zu machen, wirklich großartig, und dafür gebührt den Beteiligten Applaus.
Ich sage keineswegs, dass man die Richtung ändern sollte, es gibt mir nur zu denken.
Früher dachte ich: „Wow, zum Glück wird an dieser Arbeit gearbeitet“, heute denke ich eher: „Wow, was hätten diese brillanten Menschen erreicht, wenn sie sich nicht damit hätten beschäftigen müssen?“
Wie mehrfach gesagt wurde, sind die SciPy-Entwickler Freiwillige.
Ein Großteil des Textes erklärt, warum SciPy darauf angewiesen war, dass jemand einen Open-Source-Fortran-Compiler für Windows bereitstellt, und die Rettung scheint hauptsächlich von NVIDIA-Entwicklern gekommen zu sein.
SciPy zahlt gerade den Preis für die törichte und stark voreingenommene Entscheidung der Python-Core-Entwickler, unter Windows MSVC statt MinGW als Toolchain für Python zu wählen.
Ich vermute, die Motivation dafür lag im Microsoft-Sponsoring.
Auf der Liste der Core-Entwickler stehen einige Microsoft-Mitarbeiter; sie werden von Microsoft dafür bezahlt, auf dieser Liste mitzuwirken, und außerdem trägt Microsoft auch die Kosten für die CI-Server des CPython-Projekts.
Wenn Python für seine Toolchain keine proprietären Werkzeuge verwendet hätte, hätte sich dieses ganze Problem vermeiden lassen.
Dass „Meson die bei conda-forge verwendete Kombination aus MSVC+gfortran ablehnen wollte“, klingt nach einem Bug
Der Zweck eines Build-Tools ist es doch, die angewiesenen Befehle auszuführen, und nicht mit „Es tut mir leid, Dave“ den Weg zu versperren
Das Problem ist die von MSVC und gfortran verwendete C-Laufzeit, insbesondere dass die gfortran-Laufzeitbibliothek selbst in C geschrieben ist und die beiden ABI-seitig nicht kompatibel sind
Der von NumPy verwendete Workaround bestand darin, die Fortran-Objekte in eine DLL zu linken und mit einer Importbibliothek als indirekter Zwischenschicht zu arbeiten, um MSVC zu besänftigen
Dafür war also zusätzliche Arbeit nötig, um solche DLLs zu erstellen
Ob man das nun in den Build-Beschreibungsdateien oder in Meson macht, es musste so oder so gemacht werden, aber auf SciPy-Seite wollte man diese Zwischenschicht an keiner der beiden Stellen implementieren, und auch die Meson-Entwickler wollten dabei nicht besonders aktiv helfen
Natürlich haben die Meson-Entwickler allgemeiner bei Dingen wie Fortran- und Cython-Unterstützung geholfen, aber sie wollten keine unsichere Konstruktion bereitstellen
Tatsächlich war das eher ein Hack und funktionierte zum Beispiel nur deshalb, weil die Fortran-Seite keine von Python/C geöffneten Dateien benutzte
https://web.archive.org/web/20180711144501/https://pav.iki.f...
Persönlich habe ich Bazel öfter gesehen als Meson
Vermutlich schien Meson eine gute Wahl für SciPy zu sein, weil es in Python geschrieben ist, und da es am Ende gut geklappt hat, kann man nur gratulieren
Trotzdem halte ich CMake trotz all der Eigenheiten, Komplexität und Probleme immer noch für etwas, das dem Standard am nächsten kommt
Es kann die Befehle selbst zusammensetzen, um MSVC/gcc/clang zu unterstützen
Wenn man verlangt, dass es für eine ihm unbekannte Kombination einen Befehl zusammensetzt, kann es natürlich nur mit „Es tut mir leid, Dave“ antworten
Der Vollständigkeit halber: Ich bin der Autor eines mit Meson konkurrierenden Build-Systems, das bald veröffentlicht wird
Die kleine, kaum bekannte, aber brillante Tirade unter [1] hat mir allerdings genau das klargemacht, was ich eben beschrieben habe
Kurz gesagt: Ein Build-System sollte die Befehle ausführen, die der Benutzer ausführen lassen will, und sonst nichts
Manchmal weiß der Programmierer tatsächlich genau, was er tut
Es ist mir fast peinlich, aber bevor ich diesen Kommentar gelesen hatte, wollte ich mein Build-System möglichst magisch machen
Danach wurde mir klar, dass genau diese „Magie“ der Grund ist, warum Leute Build-Systeme hassen
[1]: https://ofekshilon.com/2016/08/30/cmake-rants/#comment-29273
Ich dachte, so etwas erledigt heute einfach jeder mit WSL2
Warum will man überhaupt noch eine native Windows-Version bauen?
In einer VM zu arbeiten ist unbequem und weniger integriert
Studierende auch
Besonders dann, wenn man darauf Docker Desktop verwenden kann
Das ist das Beste, was man aus einer nicht idealen Situation herausholen kann
Das
καταinκαταστροφήbedeutet eher nicht „Plötzlichkeit“, sondern eher „nach unten“ oder „entsprechend“, mit einer starken Konnotation, dass etwas in eine schlechte Richtung kipptDas Gegenteil von
καταist gewöhnlichανα, aberαναστροφήbedeutet wörtlich eher „nach oben drehen“ oder UmkehrungDaher wäre
ευστροφη, also eustrophe, vielleicht die bessere Neubildung für eine „gute Wendung“Wenn man allerdings eine Debatte mit JRR Tolkien über Wortschöpfungen gewinnt, dann wäre das
ευκαταστροφη, also pures GlückInsgesamt gefällt mir, dass hier überströmende Gnade eingefangen wird und dass so etwas Freude und Glück in die Welt bringt
katainkatastrofiist eigentlich näher an „against“, daher entspricht katastrofi eher dem Gedanken, dass Dinge einem „den Rücken zukehren“Ich habe den Eindruck, dass die besten BLAS größtenteils in C geschrieben sind
Dinge wie MKL, BLIS und OpenBLAS
Ich frage mich, wie weit man nur mit C und Python gekommen wäre
Und wenn man heute neu anfangen würde, ob man dann einfach
libflamewählen würdeNatürlich hat SciPy noch viele andere Funktionen wie iterative Verfahren, Sparse-Matrizen usw., daher lässt sich Fortran vielleicht nicht leicht vermeiden
Trotzdem ist Fortran eine großartige Sprache, und es ist gut zu sehen, dass sich die Tooling-Situation unter Windows zumindest zu verbessern beginnt
Auch in SciPy selbst steckt viel Fortran-Code, und ein Neuschreiben würde Arbeitskraft über Jahre hinweg erfordern
Nachdem das möglich geworden war, wurden einige Kernbereiche, die früher Fortran nutzten, tatsächlich entfernt
Zum Beispiel Teile rund um FFT
Großartiger Artikel
Ich habe dieses Jahr viel Zeit damit verbracht, ein CMake-C++-Projekt mit Python-Bindings zu modernisieren, und nachdem ich es erfolgreich als neuen Feedstock zu conda-forge hinzugefügt habe, kann ich mit Überzeugung sagen:
Wenn ich göttlicher Kaiser würde, wäre meine erste IT-Maßnahme, Windows in allen Universen für immer auszurotten
Vielleicht eine sehr naive Frage, aber ist die Fortran-Semantik so anders, dass man den Code nicht zuerst nach C übersetzen und dann mit einem C-Compiler kompilieren kann?
Danach könnte man ihn doch vielleicht auch in C weiterpflegen?
Es scheint nicht so, als gäbe es viele Fortran-Leute, die solche alten Bibliotheken warten, aber Wartung braucht es doch trotzdem, oder?
Fortran hat keine Pointer, sondern nur Arrays, und Funktionsargumente dürfen kein Aliasing haben. Wenn man also einmal den Schrecken der
COMMON-Blöcke beiseitelässt, sind aggressive Optimierung und Vektorisierung leichterStandard-Fortran-Mathematikbibliotheken funktionieren einfach gut und sind schnell
Auch in C/C++ kann man Code mit vergleichbarer Geschwindigkeit schreiben, insbesondere in C mit dem Schlüsselwort
restrictAber wenn man bestehenden Code durch einen
f2c-Schritt konvertiert, bricht die Performance in vielen Fällen deutlich einEs gibt auch durchaus genug Fortran-Entwickler
Für die Anwendungsentwicklung ist es schrecklich, aber das ist auch nicht das Hauptgebiet von Fortran
f2c existiert seit Jahrzehnten
Eine kleine Nebenfrage: Soweit ich weiß, sind
aarch64undarm64dasselbeLiege ich da falsch?
[1] https://www.phoronix.com/news/MTY5ODk
aarch64, soweit ich das sehe, meistens Linux, undarm64meistens macOS ARMIch kenne mich in dem Bereich nicht gut genug aus, um zu verstehen, warum die Namen unterschiedlich sind
Die Änderungen am Build-System von Python sind wirklich schwer nachzuverfolgen
Mich würden auch die Performance-Zahlen unter Windows interessieren
Wobei das vielleicht zunächst nicht so wichtig ist
Ernsthafte Arbeit wird vermutlich ohnehin auf einer Linux-Maschine laufen
Die große Umstellung bestand darin, alle dazu zu bringen, PEP 517 zu übernehmen, insbesondere bestehende Setuptools-Projekte umzustellen
Denn 99,9 % der Zeit läuft nicht das Betriebssystem, sondern User-Code
Das ist ein Fall, in dem schonungslos offengelegt wird, wie sehr man von binär kompilierten Sprachen verdammt noch mal abhängig ist.
Hat Python das Problem gelöst, andere Ökosysteme aber nicht? Deshalb wird man wohl vorab kompilierte Binärdateien bereitstellen.