Weissblick - Fotolia

Die passende Programmiersprache für Machine Learning wählen

Möchten sich Entwickler mit Machine Learning beschäftigen, stellt sich die Frage nach der Programmiersprache: Scala, Python, Java und R stehen zur Wahl.

Welche Sprache ist für das Schreiben von Programmen und Anwendungen am besten geeignet, wenn es um Algorithmen für maschinelles Lernen innerhalb des Apache Spark-Frameworks geht? Bei dieser Frage streiten sich die Datenwissenschaftler. Als weit verbreitete Open Source Engine für In-Memory-Datenverarbeitungen und die Berechnung von Machine-Learning-Prozessen unterstützt Apache Spark Anwendungen, die in Scala, Python, Java und R geschrieben wurden.

Assembler oder Fortran in den 1970ern, C++ oder Pascal in den 1990ern: Oft wird die Sprache der Wahl durch subjektive Präferenzen, das individuelle Fachwissen und die Erfahrung des Entwicklers bestimmt. Das hilft zwar beim Rapid Prototyping und dem ersten Go-To-Market, ist aber auf lange Sicht vielleicht nicht die beste Wahl für die Entwicklung von nachhaltigen Modellen, die sich an dem zu lösenden Geschäftsproblem und dem Umfang der erforderlichen Datenverarbeitung orientieren.

Die folgenden Punkte sollten bei der Wahl einer Programmiersprache für Machine-Learning-Anwendungen sowie der Gestaltung des jeweiligen Geschäftsmodells beachtet werden.

Leistung

Bei Java und Scala handelt es sich um kompilierte Sprachen: Quellcode wird vor der Ausführung in Bytecode kompiliert. Die Spark-Engine selbst ist in Scala geschrieben. Jeder in Scala geschriebene Code läuft nativ in einer Java Virtual Machine (JVM).

Python und R dagegen sind interpretierte Sprachen. Der Interpreter führt das Programm direkt aus und übersetzt jede Anweisung in eine Folge einer oder mehrerer Subroutinen und dann, zur Kompilierung, in eine andere Sprache, damit diese dann erfolgreich in einer Java Virtual Machine (JVM) ausgeführt werden kann.

Die kompilierten Sprachen (Java und Scala) bieten in den meisten Fällen eine bessere allgemeine Performance als die interpretierten Sprachen (Python und R). Es ist jedoch ratsam, zu einem bestimmten Zeitpunkt versuchsweise ein Profil der Anwendung zu erstellen, um festzustellen, inwieweit sich die verwendete Sprache auswirkt. Das gilt insbesondere für kleine Anwendungen.

Parallelisierung

Parallelisierung (Concurrency, auch Gleichzeitigkeit) bedeutet, dass eine Aufgabe erst beendet ist, wenn die Verarbeitung aller Arbeits- und Unter-Threads abgeschlossen wurde. Dies sorgt dafür, dass alle Threads gleichzeitig beginnen und enden.

Da Scala auf der Java Virtual Machine (JVM) läuft, hat es vollen Zugriff auf die Multi-Threading-Funktionen der JVM. Im Gegensatz zu Java ist Scala jedoch nicht nur standardmäßig auf das Konzept der Threads beschränkt, um Parallelisierung zu erreichen. Es gibt weitere, tiefgreifendere Optionen, um Gleichzeitigkeit zu erreichen, beispielsweise Futures oder Actors.

Sowohl Python als auch R hingegen unterstützen keine echte Parallelität und Multi-Threading. Multi-Threading kann nur für einige IO-Tasks parallel laufen, für CPU-gebundene, Multi-Core-Tasks jedoch nur jeweils allein. Dadurch entsteht mehr Overhead bei der Verwaltung von Speicher- und Datenverarbeitungsaufgaben.

Anwendungsentwicklung

Aus der Sicht der Benutzerfreundlichkeit erfolgt bei dynamisch typisierten Sprachen wie Python und R die Überprüfung der Variablentypen zur Laufzeit, so dass Entwickler schnell Anwendungen entwickeln können. Bei der Typprüfung werden Einschränkungen von Variablen und Datentypen überprüft und erst vom Interpreter gegebenenfalls durchgesetzt. Statisch typisierte Sprachen, wie Scala und Java, führen im Rahmen der Kompilierung eine Typprüfung durch. Allerdings ist das Refactoring und die Wartung von Anwendungen über einen längeren Zeitraum hinweg mit Scala und Java viel einfacher als mit Python und R.

Java ist wortreich (verbose), was bedeutet, dass Java-basierte Anwendungen viel mehr Zeilen Code benötigen würden, um die gleichen Operationen auszuführen, als Scala, Python oder R. Außerdem unterstützt Java kein Read-Evaluate-Print-Loop. Das macht es unmöglich, es mit gängigen Data-Science-Tools wie Jupyter Notebook zu verwenden.

Jochen Adler, OpenText

„Letztendlich hängt auch bei der Wahl Ihrer Machine-Learning-Umgebung alles davon ab, welches Problem angegangen wird, welche Erfahrungen und Fähigkeiten vorhanden sind und um welche Menge an zu verarbeitenden Daten es geht.“

Jochen Adler, OpenText

Da Apache Spark in Scala geschrieben wurde, kann umfangreiches Wissen in Scala den Entwicklern helfen, zu verstehen, wie Spark intern funktioniert. Darüber hinaus werden die APIs neuer Features immer zunächst in Scala und Java vorliegen. Auch Python-APIs sind in der Regel in stetiger Weiterentwicklung, werden jedoch erst in späteren Versionen aktualisiert.

Lernkurve

Scala, Python und Java sind objektorientierte und funktionale Sprachen. R hingegen ist funktionaler und prozeduraler Natur.

Python ist eher analytisch orientiert und ist einfacher zu erlernen und zu bedienen. Python ist weniger ausführlich und besser lesbar als Scala oder Java; die einfacher zu verstehende Syntax macht Python ideal für diejenigen, die nicht viel Programmiererfahrung haben. Scala und insbesondere Java richten sich eher an Entwickler und sind ideal für Ingenieure mit mehr Programmiererfahrung. R wurde für Akademiker, Statistiker und Data Scientists entwickelt und wird häufig zur Datenvisualisierung verwendet.

Community Support

In diesem Bereich haben Python, R und Java einen klaren Vorteil gegenüber Scala. Python und R besitzen ein viel ausgereifteres Ökosystem mit leicht zugänglichen Out-of-the-Box-Paketen. Diese implementieren die meisten der Standardverfahren und -modelle, die bereits in verschiedenen Industriezweigen und Universitäten weit verbreitet sind.

Fazit

Software-Engineering ist schon immer größtenteils die Kunst des Kompromisses zwischen widerstreitenden Anforderungen (zum Beispiel Optimierung von Laufzeit versus Arbeitsspeicher): Letztendlich hängt auch bei der Wahl der Machine-Learning-Umgebung alles davon ab, welches Problem angegangen wird, welche Erfahrungen und Fähigkeiten vorhanden sind und um welche Menge an zu verarbeitenden Daten es geht.

Eine weitere Überlegung ist, ob eine schnelle Prototyp-Anwendung oder eine nachhaltige, unternehmensweite Anwendung erstellt werden soll. Python bietet schnelles Prototyping und Entwicklung, während Scala und Java die bessere Wahl für die Verarbeitung großer Datenmengen und unternehmensweiter Implementierungen sind. R ist gut für spezifische Anforderungen, die am besten von R adressiert werden müssen, oder zur Übertragung einer bestehenden R-Umgebung auf die Apache-Spark-Plattform.

Über den Autor:
Jochen Adler ist Manager Solution Business bei OpenText. Adler befasst sich seit den 1990ern damit, wie aus losen Informationen richtungsweisende Erkenntnisse werden, wie sich Kunden- und Konsumentenerwartungen wandeln und wie Digitaltechnologie unser Leben zum Besseren verändert.

Folgen Sie SearchEnterpriseSoftware.de auch auf Twitter, Google+, Xing und Facebook!

Nächste Schritte

Kostenloses E-Handbook: Anwendung von Machine Learning.

Machine Learning: Algorithmus ist nicht gleich Algorithmus.

Data-Science-Projektbeispiel für Deep-Learning-Profis.

Erfahren Sie mehr über Big Data