Warum
?
Die Open-Source-Programmiersprache Julia wurde 2012 ins Leben gerufen und die erste stabile Version erschien 2018 (zum Vergleich: Python wurde 1991 gestartet und Python 2 im Jahr 2000 veröffentlicht).
Julia wurde entwickelt, um das Zwei-Sprachen-Problem der der Programmierung zu lösen. Auch heute noch ist das Problem weit verbreitet.
Das Zwei-Sprachen-Problem
Bevor Julia aufkam, konnte man die Programmiersprachen in solche unterteilen, die rasend schnell sind, aber einen erheblichen Zeitaufwand beim Programmieren erfordern (C, Fortran, C++, Rust), und solche, mit denen man schnell Prototypen bauen kann, welche jedoch nur langsam laufen (R, Python, Matlab).
Manchmal gibt es eine klare Priorität für schnelle Laufzeit oder schnelle Entwicklung, aber gerade in der Data Science braucht man beides:
- Sie brauchen Geschwindigkeit, weil Sie mit potentiell großen Datenmengen arbeiten.
- Und Sie brauchen eine einfach zu verwendende Sprache, weil Data Science Algorithmen normalerweise von Mathematikern, Statistikern, Kognitionswissenschaftlern, Physikern, ... und nur selten von vollwertigen Programmierern beherrscht werden.
Julia wurde von Grund auf entwickelt, um dieses Problem zu lösen.
30x bis 300x schneller als Python
Julia ist schnell. So schnell, dass Sie, wenn Sie etwas Langsames finden, es als Fehler melden können. Die Sprache verpflichtet sich konsquent zu hoher Performanz.
Die obigen offiziellen Micro-Benchmarks zeigen sehr gut, dass die Geschwindigkeit von Julia mit der von C und Rust vergleichbar ist. Besonders interessant ist der rosa Punkt beim Vergleich mit Python. Er zeigt den `matrix_statistics`-Benchmark an und obwohl die Python-Implementierung optimierte C-Hilfsprogramme wie Numpy und OpenBLAS verwendet, ist sie um eine Größenordnung langsamer als die Julia-Version. Für weitere Details folgen Sie bitte dem Zitatlink.
Hier ist eine beispielhafte User Story eines Teams, das bereits über Monate Python optimiert hat, nur um zu sehen, dass Julia noch so viel schneller ist:
Ein weiterer Vergleich zwischen Julia und Python zeigt noch wesentlich höhere Beschleunigungen.“In ein paar Tagen Arbeit konnte ich mit Julia zum ersten Mal einen Prototyp erstellen, der 14 Mal schneller war als der stark optimierte Python-Code. Dafür gibt es viele Gründe, aber einige der Hauptgründe waren Julias leichtgewichtiges Threading-Modell und die Tatsache, dass die Profilerstellung in Julia wesentlich einfacher ist, da es sich um "Julia von unten nach oben" handelt. Ein paar Wochen später ist der Code in Produktion und hat sich um das ~2fache beschleunigt, insgesamt also um das ~30fache. Soweit ich das beurteilen kann, lassen sich die Verbesserungen, die ich vorgenommen habe, in Python derzeit nicht wiederholen. Die Tatsache, dass wir mehr als 200 Expertenstunden auf die Python-Version verwendet haben, im Vergleich zu 10 Stunden eines Anfängers auf Julia, sagt auch viel über die Erfahrung der Entwickler aus.”Quelle: Julia Forum, englisches Original, übersetzt mit DeepL
Effizienteres Entwickeln
Eine Julia-Lösung ist Julia "von Grund auf". Es gibt keine Barriere, bei der Entwickler zu einer anderen Sprache wechseln und die beiden Sprachen überbrücken müssen.
Dadurch wird die Entwicklung massiv vereinfacht. Lösungen werden schneller erstellt, Probleme werden leichter untersucht, Leistungsengpässe werden zuverlässiger gefunden und Wissen wird besser geteilt. Auch neue Teammitglieder sind viel schneller an Bord.
“Der Vorteil von Julia ist, dass gute Leistung nicht auf eine kleine Teilmenge von "eingebauten" Typen und Operationen beschränkt ist, und man kann hochgradig typgenerischen Code schreiben, der mit beliebigen benutzerdefinierten Typen arbeitet und dabei schnell und speichereffizient bleibt. Typen in Sprachen wie Python liefern dem Compiler einfach nicht genug Informationen.”Quelle: Julia Dokumentation, englisches Original, übersetzt mit DeepL
Aus Sicht eines Entwicklers gibt es drei Hauptaspekte von Julia:
- Sie können generische Funktionen schreiben, die für alle Typen funktionieren.
- Sie können Funktionen spezialisieren, falls Sie eine effizientere Implementierung für Ihre konkreten Typen kennen.
- Wenn Sie Funktionalität zwischen verschiedenen Typen wiederverwenden wollen, geht das nur über generische Funktionen.
Dies ist ein beeindruckend einfaches Design, das durch Julias ausgereifte Just-in-Time-Kompilierung (JIT) zu Performanz aufblüht. Für den Entwickler bedeutet dies, dass er sich nicht um die Leistung kümmern muss, bis er sie wirklich braucht, und dann kann er einen winzigen Teil seines Systems spezialisieren, während der Rest wiederverwendbar ist.
Leichtere Wartung
Alles ist kombinierbar
- Sie möchten Ihren Zahlen physische Einheiten hinzufügen? Importieren Sie einfach das Paket Unitful.jl und fügen Sie sie hinzu.
- Sie wollen Fehlerspannen für Ihre Ergebnisse? Importieren Sie einfach Measurements.jl und fügen Sie sie hinzu.
- Es gibt noch viele weitere wiederverwendbare Komponenten im Julia-Ökosystem, die in anderen Sprachen so nicht möglich wären.
Alle von Ihnen erstellten Funktionen werden weiterhin funktionieren, nichts muss neu geschrieben werden.
Es wird auch Ihr eigenes Projekt vereinfachen, und Einfachheit ist der wichtigste Aspekt bei der Softwareentwicklung. Künftige Anpassungen können leicht hinzugefügt werden, ohne dass Sie befürchten müssen, dass Sie eine umfangreiche Neuprogrammierung vornehmen müssen. Die Wartung wird vereinfacht, und Ihr Projekt wird nahtlos Wechsel innerhalb Ihres Entwicklerteams überleben.
Wie macht Julia das?
Eine solche Kompositionsfähigkeit ist beispiellos und ein einzigartiges Merkmal des Programmierparadigmas von Julia. Julia ist weder eine objektorientierte, noch eine funktionale Sprache. Stattdessen verfügt sie über einen flexiblen Funktionsüberlade-Mechanismus, auch Multimethode genannt.
Ein einfacher Weg, diese Unterscheidung zu verstehen, ist, an ein Kochbuch zu denken. Die verschiedenen Programmierparadigmen geben unterschiedliche Anleitungen, wie die Rezepte zu strukturieren sind.
-
🥦 Brokkoli
- Kochen
- Dünsten
-
🥕 Karotten
- Frittieren
- Kochen
-
Kochen
- 🥦 Brokkoli
- 🥕 Karotten
-
Frittieren
- 🥕 Karotten
- 🧅 Zwiebeln
- Brokkoli 🥦 Dünsten
- Karotten 🥕 Kochen
- Karotten 🥕 Frittieren
- Zwiebeln 🧅 Frittieren
Der Einsatz von Multimethoden gibt nicht vor, wie Sie den eigenen Code anordnen. Dies ermöglicht volle Flexibilität, ohne dass bereits vorhandener Code umgeschrieben werden muss.
Auch wenn es so aussieht, als ob wir die Organisation komplett verloren hätten, gewinnen wir sie in der Programmierung dank der Type-Hierarchien zurück. Brokkoli und Karotten wären Gemüsesorten, Linsen und Bohnen sind Hülsenfrüchte, Kochen und Dünsten könnten Heißwasserzubereitungen sein.
Mehr Details zur Kochbuch-Analogie finden Sie in diesem Blogbeitrag.
Gebaut für Data Science
Julia wurde konzipiert für die Datenwissenschaft und die angewandte Mathematik im Allgemeinen und findet bereits heute in diesem Feld eine weite Verbreitung.
& Optimierungsbibliotheken
Ob Sie im Finanzsektor, in der Energiebranche, der Chemie, der Biologie, der Medizin, dem Ingenieurwesen, der Quanteninformatik, der Astronomie oder vielen anderen Bereichen tätig sind: Es gibt bereits andere, die die nächsten Best-Practice-Algorithmen für Ihre Branche entwickelt haben.