Warum Python (statt Java)?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Sowohl Java, als auch Python, ist einfach nur ein Werkzeug. Beides sind zwar gute Werkzeuge, aber man sollte sie dort einsetzen, wo sie ihre jeweilige Stärke ausspielen können.

Wer auf Teufel komm raus immer nur seine Lieblingssprache bzw. -plattform einsetzt, ist kein professioneller Softwareentwickler!

Einige Punkte, die für Python sprechen:

  • Mit pypy ist Python wesentlich schneller als Java (sogar wesentlich schneller als reiner C-Code!) Momentan dürfte es in keiner anderen Programmiersprache eine so ausgfeilte Branch-Prediction geben! Und gerade im Wissenschaftlichen Bereich wird pypy gern eingesetzt. (Wenn du das alles nicht glaubst, oder dir nicht vorstellen kannst, such mal bei Google, oder bei Youtube Vorträge!)

  • Stringoperationen sind mit Java ein Krampf! (Ich sage nur StringBuffer oder StringBuilder) Hier ist Python mit Sicherheit um den Faktor 1000 überlegen ... wenn nicht noch mehr. Das sieht man auch daran, dass im Linguistik-Bereich (NLP - Natural Language Processing) Python der defacto Standard ist.

Kleiner Vergleich (erstmal Java):

String s1 = "abcd";
String s2 = s1.substring(2,3)

Und in Python das selbe:

s1 = "abcd"
s2 = s1[2:3]

Und das ist noch ein Beispiel, bei dem Java noch sehr gut dasteht. Im Schnitt sind Operationen auf Strings in Python ungefähr halb bis ein zehntel so groß, und dabei sehr übersichtlich ... man kann sehr schnell damit arbeiten.

Kann man mit Java zwar auch, aber mit Python - in diesem speziellen Fall - eben deutlich besser. :)

Naja, man kann sich hier Hundert Jahre lang die Vor- und Nachteile sowohl von Python, als auch Java, gegenseitig an den Kopf schmeißen, aber darauf kommt es nicht an!

Es kommt darauf an, zu verstehen, dass Sprache A eben manchmal das bessere Werkzeug ist, als Sprache B. Ob du nun Python oder Java für A einsetzt, ist egal.

Ein wirklich guter Programmierer beherrscht mehrere Programmiersprachen, und weiß diese auch entsprechend einzusetzen.

Programmierer, die nur eine einzige Sprache beherrschen, sollten mal überlegen, ob es vielleicht an der Zeit ist, etwas dazu zu lernen! :)


grtgrt 
Beitragsersteller
 27.02.2015, 09:44

An alle:

Meine bisherige Meinung, Python sei überflüssig, da wir ja schon C++, C# und Java haben, war falsch.

Vielen Dank an TeeTier, dass er sich die Mühe gemacht hat, mir das klar zu machen.

Und danke auch an dich, Youkakun, der du TeeTier zu noch ein paar mehr hilfreichen Bemerkungen animiert hast, ...

Ich weiß jetzt auch, dass ich bisher (mit ganz wenig Ausnahmen) nur Programmierer getroffen habe, die diese Berufsbezeichnung wohl nie verdienen werden.

Das soll diese Personen aber nicht beleidigen: Denn welcher Anwendungs-Entwickler hat schon Zeit und Gelegenheit sich über Jahre und Projekte unterschiedlichster Anforderungen hinweg ausschließlich mit Programmierung zu befassen ...

1
TeeTier  27.02.2015, 16:51
@grtgrt

Einsicht ist der Weg zur Besserung! :)

Ich denke, es wäre nützlich für dich, wenn du dir Python beibringen würdest. Auch wenn es am Anfang ungewohnt (Syntax, Module, GIL, ...) sein mag sollten sich gerade Java-Entwickler relativ schnell in die Sprache einfummeln können. Einfach mal einen Monat lang zusammenreißen, und täglich ein bisschen Python skripten ... dann erkennst du irgendwann selbst die Vor- und Nachteile und kannst dir selber ein Bild machen!

Am Anfang ist die Lernkurve ja bekanntlich am steilsten, aber als Java-Programmierer solltest du so etwas ja gewohnt sein. Im Schwierigkeitsgrad nehmen sich Python und Java nicht viel ... aber das ist nur meine persönliche Meinung. Muss jeder für sich selbst herausfinden. :)

Vielen Dank für die Bewertung und einen schönen Tag noch! :)

0
Youkakun  26.02.2015, 23:24

Da spricht der Python Fanboy -.- Nicht objektiv mit falschen Daten und lächerlichen Übertreibungen.

Mit pypy ist Python wesentlich schneller als Java (sogar wesentlich schneller als reiner C-Code!)

pypy nutzt einen JIT-Compiler, genauso wie die JVM. Der Vorteil von Just-in-time Kompilierung ist, dass Code in optimale Maschinensprache (für den Host) während der Laufzeit kompiliert wird, während Compiler von Kompilierungssprachen (im Sinne von direkter Umwandlung in Maschinencode) eher die Mittel einer Hardware-Familie anzielen und sich somit auf weniger, teils langsamere, Befehle einschränken. Letzteres erklärt den Geschwindigkeitsgewinn gegen in C geschriebene Programme, dennoch ermöglichen einfache Skriptsprachen keine "genauen" Beschreibungen für die Hardware, es finden viele unnötige Nebenschritte selbst bei simplen Funktionen statt. Genauso hat Java durch seinen Minimalismus im Gegensatz zu Python auch Bereiche, in der die Sprache schneller arbeiten kann. Am Ende ist es ein Kampf der Optimierer, wobei Python es wesentlich schwerer macht als C oder Java, und die Fähigkeiten des Programmierers selbst. Nun Python in den Himmel zu predigen, wo doch guter C Code nahezu immer gewinnt und auch Java in den meisten Benchmarks fantastische Ergebnisse erzielt... TeeTier, ich würde gerne mal wissen, woher du die Daten nimmst, die zitierte Aussage bekräftigen zu können.

Und gerade im Wissenschaftlichen Bereich wird pypy gern eingesetzt.

Genauso wie die JVM, welche allerdings in Universitäten bevorzugt eingesetzt wird, während Python eher der Ersatz für Batch ist, um schnelle, schmutzige Skripte zu schreiben.

Stringoperationen sind mit Java ein Krampf! (Ich sage nur StringBuffer oder StringBuilder) Hier ist Python mit Sicherheit um den Faktor 1000 überlegen ... wenn nicht noch mehr.

Für einfachere String-Behandlung gibt es eigene Klassen in Java Frameworks. Die Modularisierung in Java hat den Vorteil, dass die Klassen kleiner sind und der Programmierer genauer beschreiben kann, was am Ende eigentlich getan werden soll - alles zum Vorteil der Kompilierungs- und Laufzeit-Geschwindigkeit.

Kleiner Vergleich (erstmal Java): ...

Ja, Java steht dort sehr gut da. Bei Java ist der Datentyp von der Deklaration her bekannt und auch der Methodenaufruf weist darauf hin - bei falscher Nutzung meckert der Compiler konstruktiv. Bei Python wird ein String wie eine Liste behandelt, Fehler können sich leichter verstecken.

Also wirklich. Python ist eben eine einfach zu erlernende Sprache mit wenig benötigten Code für die üblichsten Aufgaben, damit wirbt die Sprache ja auch, aber sie wird Java niemals ablösen, allein schon wegen Unterschieden wie der Typisierung, Kapselung und Community.

1
TeeTier  27.02.2015, 05:23
@Youkakun

Erstmal vorweg: Lies dir bitte mal meine längeren 3 neuen Kommentare durch, die ich eben verfasst habe. Ich glaube, dann wird dir einiges klarer. :)

Da spricht der Python Fanboy -.-

Ich bin kein Fanboy ... weder Python, noch Java, noch Assembler, noch C, ...

Aber wenn jemand - offensichtlich unbegründet und aus Mangel an Erfahrung - eine einzige Programmiersprache (in diesem Falle Java) für den heiligen Gral hält, und im selben Atemzug ein weiteres sehr gutes Werkzeug (Python) als nichtig erklärt, obwohl beide unterschiedliche Einsatzzwecke verfolgen, und auf ihren jeweiligen Gebieten auch ihre individuellen Stärken ausspielen können, dann steuere ich dagegen. :)

Nicht objektiv mit falschen Daten und lächerlichen Übertreibungen.

Siehe die anderen Kommentare weiter oben!

pypy nutzt einen JIT-Compiler, genauso wie die JVM. Der Vorteil von Just-in-time Kompilierung ist, ...

Jaja, ich weiß was pypy nutzt, und ich weiß, was JIT ist. Dennoch ist pypy in einigen Bereichen schneller als C. Punkt. Und da gibt es auch nicht zu diskutieren.

Dass das natürlich nur auf einige Bereiche bzw. gut optimierbare Probleme zutrifft erklärt sich von selbst. Ich hoffe, du hast meine Aussagen nicht so aufgefasst, als sei pypy IMMER schneller als C. Ich meinte, pypy ist TEILWEISE auch schneller als C. Mehr nicht.

Vielleicht war das ein Kommunikationsproblem? :)

Nun Python in den Himmel zu predigen, ...

Ich predige nicht, sondern habe nur einen Gegenpol zum Fragensteller gesucht. Wie gesagt, ich bin selber Java-Programmierer.

Wenn ein Azubi zum Handwerker kommt, und erklärt, dass der Hammer das geilste Werkzeug der Welt ist, und man die anderen eigentlich nicht benötigt, wird der Handwerker ebenfalls versuchen, dies Argumentativ zu widerlegen, auch wenn dabei solche schrägen Vergleiche wie "Mit einem Schraubenzieher kann man gut Kisten aufhebeln" herauskommen. Es geht weniger um die Vorteile des Schraubenziehers (Python), als vielmehr um die möglichen Einschränkungen des Hammers (Java).

Und Java ist nun mal im Vergleich zu Python für vieles absolut ungeeignet, wo Python die deutlich bessere Wahl wäre! :)

wo doch guter C Code nahezu immer gewinnt und auch Java in den meisten Benchmarks fantastische Ergebnisse erzielt...

Natürlich! Das sehe ich ja auch so! Es ist aber offensichtlich anders rüber gekommen, sorry dafür!

Ich versuche schon so oft wie möglich Relativierungen wie "kann sein" oder "manchmal" einzubauen, da ich aus Erfahrung weiß, dass nichts Absolut ist. Aber offensichtlich habe ich das in meinem Posting vernachlässigt. Mein Fehler!

Auf jeden Fall bin ich mit dir völlig einer Meinung! Trotzdem kann (!) pypy schneller als optimierter C-Code sein. :)

Bei Java ist der Datentyp von der Deklaration her bekannt und auch der Methodenaufruf weist darauf hin - bei falscher Nutzung meckert der Compiler konstruktiv. Bei Python wird ein String wie eine Liste behandelt, Fehler können sich leichter verstecken.

Ob eine Sprache statisch oder dynamisch typisiert ist, ist eine Sache des Sprachkonzeptes. Wer mit einem statischen Konzept in einer dynamischen Programmiersprache entwickelt, macht etwas falsch. Umgekehrt genauso.

In all den Jahren hatte ich bei Python nie das Problem, mir bewusst Gedanken um Typen machen zu müssen. Wenn ich in C Programmiere, möchte ich die Typsicherheit aber auf gar keinen Fall missen (von void-Pointern mal abgesehen).

Ich kann beides sehr gut unterscheiden, und mit beiden Konzepten flüssig arbeiten, ohne bei einem der beiden mehr Programmierfehler zu verursachen. Wenn du auch AKTIV in Python UND Java programmierst, müsstest du das eigentlich wissen.

Als Beispiel zur statischen und dynamischen Typisierung, guck dir bitte noch mal mein zweites (wesentlich besseres) Codebeispiel weiter oben in einem der neuen Kommentare an! Mal von der Typsicherheit abgesehen, sogar als Javaprogrammierer mit völliger Pythonunkenntnis sollte das Python Beispiel auf Anhieb lesbar sein. :)

Also wirklich. Python ist eben eine einfach zu erlernende Sprache mit wenig benötigten Code für die üblichsten Aufgaben, damit wirbt die Sprache ja auch, aber sie wird Java niemals ablösen, allein schon wegen Unterschieden wie der Typisierung, Kapselung und Community.

Häh? Das hat doch niemand behauptet! Ich habe sogar genau das komplette Gegenteil geschrieben! Lies dir bitte nochmal meine ursprüngliche Antwort durch! Ich habe deutlich darauf hingewiesen, dass beide Sprachen richtig, wichtig und nötig sind und man sich die Vergleiche eigentlich knicken kann.

Mir scheint, wir haben arge Kommunikationsprobleme! :)

Allerdings beim letzten Punkt (Community) weiß ich nicht, was du sagen willst. Sowohl die Python, als auch die Java Communities sind riesig! Was Typisierung und Kapselung anbelangt ... tja, ist eben so ... sind halt unterschiedliche Konzepte ... muss man sich dran gewöhnen! Ist ja bei R, Ruby, Clojure oder Erlang auch nicht anders. Dennoch kann man mit allen prima Arbeiten. :)

Schönen Tag noch! :)

2
Youkakun  27.02.2015, 12:36
@TeeTier

Nun, deine Antwort wirkte auf mich stark wie eine Werbung für Python und gegen Java, allein solche Übertreibungen wie mit der Zahl 1000 und ausnahmslose Aussagen wie "wesentlich schneller" machen auf mich immer einen unseriösen Eindruck.

Allerdings beim letzten Punkt (Community) weiß ich nicht, was du sagen willst.

Wie schon gesagt, ist Python einfach zu erlernen, weswegen diese Sprache leider auch die erste Wahl vieler Skriptkiddies ist und auf Plattformen wie Stackoverflow oder Codeproject viel Mist bei Fragen und Erklärungen rumkommt, bei Java habe ich während meiner Lernphase vor knapp 7 Jahren weit bessere Erfahrungen gemacht. Auch die Aktivität der Entwickler der JVM und der meisten Java Bibliotheken gefällt mir eher als bei den Python-Äquivalenten. Damit möchte ich nichts verpönen, aber ich vertraue Projekten eher, wenn auch die Entwickler mehr Interesse daran zeigen.

Die restlichen Punkte hast du in deinen anderen Beiträgen gut erklärt. Ich danke dir für deine Mühe in den Klarstellungen und entschuldige mich, dich in eine Ecke mit verblendeten Fanboys gesteckt zu haben.

0
TeeTier  27.02.2015, 16:46
@Youkakun
Nun, deine Antwort wirkte auf mich stark wie eine Werbung für Python und gegen Java, allein solche Übertreibungen wie mit der Zahl 1000 und ausnahmslose Aussagen wie "wesentlich schneller" machen auf mich immer einen unseriösen Eindruck.

Da kann ich dich sogar verstehen, geht mir nicht anders! Aaaaber, da ich normalerweise nicht die Zeit habe, hier mehrere Tausend Zeichen lange Beiträge zu posten, verkneife ich mir oft Quellenangaben oder Beweise und versuche dann durch "Übertreibungen" zu überzeugen. Werde ich in Zukunft wohl mal ändern müssen. :)

Das ist zugegebenermaßen zwar nicht gut, ändert aber i. d. R. nichts an der Richtigkeit meiner Aussagen.

Wie schon gesagt, ist Python einfach zu erlernen, weswegen diese Sprache leider auch die erste Wahl vieler Skriptkiddies ist und auf Plattformen wie Stackoverflow oder Codeproject viel Mist bei Fragen und Erklärungen rumkommt, bei Java habe ich während meiner Lernphase vor knapp 7 Jahren weit bessere Erfahrungen gemacht.

Also ich habe 1997 mit Java angefangen, und seit damals gibt es in Foren oder bei SO die immer gleichen dämlichen Anfängerfragen. Da nimmt sich Python und Java nicht viel ... guck dich einfach mal hier bei GF um! Die meisten solcher Fragen ignorier ich eigentlich, und antworte nur, wenn für mich ein Mehrwert für andere Mitleser erkennbar ist.

Und Skriptkiddies nehmen sich m. W. n. bei Java und Python auch nicht viel. Die Fragen, die man hier z. B. über DOS-Batch oder AutoIT / AutoHotkey oder PHP / JS liest, sind im Schnitt viel schlimmer als Java- / Python-Fragen. :)

Damit möchte ich nichts verpönen, aber ich vertraue Projekten eher, wenn auch die Entwickler mehr Interesse daran zeigen.

Mmmmh ... naja, seit Java 5 gabs viele richtig knackige Neuerungen, vor allem wurden ja die Packages und der JIT Compiler massiv erweitert / verbessert. Allerdings, dass die seit Java 6 angekündigten Sprachfeatures noch doch teilweise nicht mal in 9 erscheinen werden, wirft Fragen auf. Immerhin scheint die geplante Modularisierung (Jigsaw) voranzuschreiten.

Bei Python hingegen würde mir eine Überholung des "html.parser" Moduls gefallen, da sich dieser Parser mit regulären Seiten aus dem Netz regelmäßig verschluckt. Dafür gibts zwar den "Beautiful Soup" Parser, aber für kleine Sachen möchte ich nicht immer auf Third-Party angewiesen sein, nur um mal schnell eine verkorkste Website OHNE Exceptions parsen zu können. (wohlgemerkt, bei 99% der Webseiten funktioniert der Python Parser zwar einwandfrei, aber bei jeder hundertsten gibts dann halt Probleme)

Ich danke dir für deine Mühe in den Klarstellungen und entschuldige mich, dich in eine Ecke mit verblendeten Fanboys gesteckt zu haben.

Dir sei verziehen! :)

Aber wie gesagt, ich habe mich missverständlich ausgedrückt. Meine Schuld! ><

1
grtgrt 
Beitragsersteller
 26.02.2015, 13:47

Dass man Programme, die vor allem Text analysieren oder manipulieren, nicht in Java oder C# schreiben sollte, sehe ich ebenso.

Dazu nämlich ist C (oder ein über C nur wenig hinausreichendes Subset von C++) weit besser geeignet -- natürlich unter Verzicht auf sog. Stringklassen !!!.

FRAGE aber: Ich dachte immer, Python würde durch seine Interpreter auf in C implementierte Module abgebildet. Wie kann es dann stellenweise deutlich schneller als C-Code arbeiten?

1
TeeTier  26.02.2015, 13:55
@grtgrt
FRAGE aber: Ich dachte immer, Python würde durch seine Interpreter auf in C implementierte Module abgebildet. Wie kann es dann stellenweise deutlich schneller als C-Code arbeiten?

Diese Frage zu beantworten würde hier den Rahmen sprengen, aber ich habe am Anfang auch genau so gestutzt wie du!

Das ist ein verdammt interessantes Thema, also guck dir ruhig mal ein paar Vorträge über pypy auf Youtube an!

Das kann ich unmöglich alles hier zusammenfassen! :)

PS: Guck dir vor allem mal die Benchmarks mit pypy, C, C++, usw. an ... das ist beeindruckend! :)

1
grtgrt 
Beitragsersteller
 26.02.2015, 17:48
@TeeTier

Ganz am Ende von Abschnitt 4.7 der Seite https://deap.readthedocs.org/en/0.8.2/tutorials/speedup.html#distribution findet sich eine 3-zeilige Tabelle, die sagt, dass für das dort betrachtete Beispiel

  • pypy 4,3 Mal
  • und C++ 16,1 Mal

schneller als CPython gearbeitet hat.

Aus diesen Zahlen jedenfalls kann man nicht entnehmen, dass es sich lohnt, neben C++ auch noch Python zu verwenden.

Meinen Eindruck, Python sei überflüssig wie ein Kropf, sehe ich hier bestätigt.

1
grtgrt 
Beitragsersteller
 26.02.2015, 18:30
@grtgrt

Es scheint also so zu sein:

Wem an bestmöglicher Performanz gelegen ist -- ohne dass er deswegen gleich Assembler verwenden möchte --, der ist mit C++ am besten bedient. Den gesamten Umfang dieser komplizierten Sprache zu kennen und zu nutzen ist dabei gar nicht notwendig. Meist reicht ein Subset, das "C vermehrt um die Möglichkeit, Klassen und Objekte im objektorientierten Sinne zu haben" entspricht.

Wem umgekehrt daran gelegen ist, möglichst gut strukturierten, robusten, bestmöglich wartbaren Sourcecode zu bekommen, der verwende -- je nach Plattform -- entweder C# oder Java: eine Sprache also, die Mainstream ist und mit einer möglichst umfangreichen Bibliothek von Klassen kommt, die häufig benötigte Hilfsfunktionalität darstellen (.NET bzw. JEE sind als solche Bibliotheken bislang unübertroffen).

Ziel sollte sein: Wer programmiert, produziere Code, der möglichst Mainstream-Charakter hat.

Das bedeutet auch, dass man zum Erstellen graphischer Benutzeroberflächen heute nach Möglichkeit HTML5, JavaScript und SVG verwenden sollte -- nichts weiter.

Zudem gilt: Je mehr generiert und je weniger von Hand programmiert wird, umso besser -- dann jedenfalls, wenn die Performanz darunter nicht wesentlich leidet.

1
TeeTier  27.02.2015, 03:24
@grtgrt
Aus diesen Zahlen jedenfalls kann man nicht entnehmen, dass es sich lohnt, neben C++ auch noch Python zu verwenden.

Habe gerade ein Benchmark zwischen C und Python im Bezug auf Speicheralloziierung und Stringformatierung gefunden. Pypy ist fast doppelt so schnell (genauer gesagt Faktor 1.9) wie maximal optimierter C Code (GCC mit -O4 kompiliert)!

Natürlich ist Pypy und vor allem Python in den meisten Bereichen wesentlich langsamer als C, aber in den meisten Bereichen (!) kommt es auch fast gar nicht auf Höchstgeschwindigkeit, sondern viel mehr auf gute Wartbarkeit an.

Außerdem sei dir das "PyPy Speed Center" ans Herz gelegt (tausende von Benchmarks mit anderen Sprachen und Kompilerversionen), und davon abgesehen findet man wirklich ausreichend Ressourcen im Netz, wenn man z. B. nach "pypy performance c" oder so ähnlich sucht.

Meinen Eindruck, Python sei überflüssig wie ein Kropf, sehe ich hier bestätigt.

An dieser Aussage erkennt man eine Sache sehr deutlich: Du bist noch ein unerfahrener Anfänger, der nur über ein sehr begrenztes Wissen auf diesem Gebiet verfügt und noch nicht einschätzen kann, zu welchem Zeitpunkt man das richtige Werkzeug einsetzen muss.

Ich habe das schon in anderen Threads geschrieben, aber hier nochmal: Ich programmiere jetzt seit Anfang der 90er Jahre auf inzwischen fast 20 Plattformen und in weit (!) über 40 Programmiersprachen, und ich war jedes mal froh, das richtige Werkzeug zur Hand gehabt zu haben. Mir ist tatsächlich noch keine Programmiersprache untergekommen, die nicht ihre Daseinsberechtigung und zumindest punktuell gravierende Vorteile gegenüber den anderen hat.

Und mit meinem Wissen, und meiner Erfahrung kann ich dir sagen: Ich spüre, dass ich noch lange nicht alles weiß und lerne täglich hinzu!

Wer mit dem Lernen aufhört, weil er meint, mit seiner Lieblingsprogrammiersprache alles tot schlagen zu können, zeigt nur, wie unerfahren er ist.

Und im Übrigen - das wirst du mangels Erfahrung nicht verstehen, aber egal - wirst du ein deutlich (!) besserer Java Programmierer werden, wenn du weitere Programmmiersprachen beherschst!

Mit Python kannst du z. B. so tolle Konzepte umsetzen, wie "Metaklassen Programmierung", was mit Java schlicht nicht möglich ist, aber dir die Augen für neue Techniken öffnen wird. Von anderen Programmiersprachen wie Scheme, Erlang oder Assembler mal abgesehen.

Wie ich bereits erwähnt habe, können wir hier Tage damit verbringen, uns die Vor- und Nachteile von Sprache XYZ gegenseitig näher zu bringen, aber am Ende hat Python DEUTLICHE Vorteile gegenüber Java, und umgekehrt Java auch DEUTLICHE Vorteile gegenüber Python. Es kommt wirklich nur auf die Sichtweise und die Anforderungen an.

Wer sagt, Python sei überflüssig, entblößt damit seinen Mangel an Erfahrung!

2
TeeTier  27.02.2015, 03:58
@grtgrt
Es scheint also so zu sein:

Gut erkannt! Es "scheint"! Und weil du noch nicht über viel Erfahrung verfügst (nicht böse gemeint, aber an deinen Aussagen merkt man deutlich, dass du noch nicht lange programmierst!), kommst du zu falschen Schlüssen, die für dich, mit deinem begrenzten Hintergrundwissen, richtig erscheinen. (Wie gesagt, nicht böse gemeint!)

Wem an bestmöglicher Performanz gelegen ist -- ohne dass er deswegen gleich Assembler verwenden möchte --, der ist mit C++ am besten bedient.

Nur mal so eine kleine Feststellung meinerseits: Ich habe vor ein paar Jahren den von C++ verwendeten - und im Standard vorgeschriebenen - Hash-Algorithmus untersucht, und festgestellt, dass der Berkeley-Datenbank-Hashalgorithmus um den Faktor 7 schneller ist, und eine um den Faktor 5 bessere "zufällige" Verteilung erzeugt.

Das nur als kleine Anmerkung, da dir ja offensichtlich so viel an Geschwindigkeit gelegen ist. Wenn man jetzt einfache Datenstrukturen wie Bäume oder Mengen mit C, C++, Assembler, Pascal oder einer anderen Low-Level-Sprache neu implementiert, ist der Zugriff fühlbar fast 10 (beide obige Faktoren addieren sich hier fast linear) mal so schnell, und als Nebeneffekt hat man eine deutlich bessere Speicherausnutzung (wegen der besseren Verteilung).

Im Übrigen bin ich recht fit in Assembler, da ich beruflich viel Reverse Engineering machen muss, und nur durch dieses Assembler und Low-Level-Hardware Wissen ist mein C / Java / Python Code oft deutlich effizienter und schneller als der von Kollegen. (im Schnitt Faktor 10 bis 100 ... wohlgemerkt OHNE Compileroptimierungen oder Low-Level-Programmierung)

Aus diesem Grunde sollten auch Leute, die ausschließlich in Hochsprachen (JIT, kompiliert oder interpretiert) programmieren, verstehen lernen, was ein "new" oder "try" macht.

Du kannst doch Java, oder? Was macht denn ein "new"? Was macht ein "try"? Weißt du das? Ich meine natürlich nicht, in der VM, und auch nicht auf Betriebssystemebene, sondern noch eine Schicht tiefer. Wenn du so etwas weißt, DANN kannst du auch effektiv in Java-Programmieren. Von Nebenläufigkeit mal ganz zu schweigen. (Stichwort Low-Level-IPC)

Hast du schon mal einen Java-Server geschrieben? Mit oder ohne Framework? Wieviele gleichzeitige Verbindungen hält der aus? 5000? 10000? Das berühmte C10K-Problem ... nun, wenn man sich mit Low-Level-Programmierung auskennt, ist das ein Witz, und man beschäftigt sich eher mit C10M (10 Millionen gleichzeitige Verbindungen). Dafür benötigt man normalerweise einen größeren Java-Cluster anstatt einen einzigen Heimcomputer.

Apropos, Netzwerk ... habe vorhin mal schnell in Python ein Skript geschrieben, welches Parallel (mit 100 Prozessen, die jeweils 100 Threads ausführen, also 10000 gleichzeitige Verbindungen) tausende von Domain-Namen überprüft. Die Single-Thread-Lösung hätte vermutlich mehrere Tage benötigt, aber so war es eine Sache von Minuten.

Gerade für solche kleinen Miniskripte ist Python ideal, und ich würde dafür kein Java einsetzen ... einfach weil es ungeeigneter als Python ist! Wohl dem, der zwischen seinen Werkzeugen wählen kann, und nicht auf sein einziges Lieblingswerkzeug angewiesen ist. :)

Wem umgekehrt daran gelegen ist, möglichst gut strukturierten, robusten, bestmöglich wartbaren Sourcecode zu bekommen, der verwende -- je nach Plattform -- entweder C# oder Java: ...

Also GERADE Python ist ja nun wirklich sehr gut strukturiert, robust und wartbar. Ich weiß nicht, was dabei jetzt der Vorteil von Java oder C# sein soll ... gerade in den von dir genannten 3 Punkten nehmen sich alle 3 Sprachen überhaupt nichts und liegen - meiner Erfahrung nach - absolut gleich auf.

eine Sprache also, die Mainstream ist und mit einer möglichst umfangreichen Bibliothek von Klassen kommt, die häufig benötigte Hilfsfunktionalität darstellen.

Auch hier merkt man, dass du offensichtlich Scheuklappen aufgesetzt hast, und wirklich mal über den Tellerrand blicken solltest. Python IST Mainstream und HAT eine umfangreiche Bibliothek von Klassen (bzw. Modulen).

Dass weder C#, noch Java, noch Python den exakt gleichen Funktionsumfang der "Standardbibliothek" bieten, dürfte jedem klar sein. Hier bieten einige mehr, und andere weniger Funktionen, je nach Einsatzgebiet. Dass als Third-Party sowieso alles für alle Programmiersprachen verfügbar ist, sollte klar sein, aber z. B. bietet Python in der Standardbibliothek einen "robots.txt" Parser, für Leute, die mal schnell einen Crawler zusammenzimmern wollen. Java hat dafür die Robot-Klasse, um Userinteraktionen zu automatisieren. Python kann dafür über das ctypes-Modul direkt auf Bibliotheksfunktionen des Betriebssystems zugreifen, ohne wie bei Java erst mit JNI oder Drittanbietersoftware anfangen zu müssen.

Ich hoffe du merkst, dass KEINE Sprache AUSSCHLIEẞLICH aus Positiem oder Negativem besteht! :)

(.NET bzw. JEE sind als solche Bibliotheken bislang unübertroffen).

Das hängt seeehr vom Blickwinkel des Betrachters ab! :)

3
TeeTier  27.02.2015, 04:44
@grtgrt

PS: Sorry, der Platz hat nicht mehr gereicht. Ich möchte nochmal auf deine letzte Aussage zurück kommen:

Zudem gilt: Je mehr generiert und je weniger von Hand programmiert wird, umso besser -- dann jedenfalls, wenn die Performanz darunter nicht wesentlich leidet.

Im Gegensatz zu Java ist Python auch eine funktionale Programmiersprache. Und deine obige Aussage bezieht sich zu 100% auf Python, und NICHT auf Java! Hast du jetzt plötzlich deine Meinung geändert? :)

Beispiel: Wir wollen eine Liste von TLDs, die als String vorliegt, aufsplitten, formatieren, Doubletten entfernen, sortieren und ausgeben, wobei auf eine fehlerhafte Eingabe mi doppelten oder mehrfachen Leerzeichen Rücksicht genommen wird:

tlds = 'de at ch com org net eu fr de it ch es'
print(', '.join(sorted(set(x.lower() for x in tlds.split() if x))))

Das ganze ist sehr gut lesbar ... man muss im Code nicht hin und her springen, sondern kann die Codezeilen geradewegs von vorne bis hinten - fast wie ein normaler englischer Satz - lesen.

Natürlich kann man das ganze auch auf mehrere Zeilen verteilen, um einem absoluten Anfänger das Lesen zu erleichtern, aber selbst dann verbrauchen wir weniger als halb so viele Zeilen Code, die in Java nötig wären. Wobei die Python Zeilen jeweils auch WESENTLICH kürzer als halb so lang, wie die Java Zeilen wären.

Insgesamt erreicht man mit einer Zeile klar lesbarem Quellcode genauso viel, wie in einem verhältnismäßig riesigen Block Java-Code, der dann aufgrund seiner Größe und solchen Sachen wie einer generischen Menge (Set) für Anfänger mindestens genauso schwierig zu lesen wäre, wie der Python Code.

Wobei wir nicht von Anfängern ausgehen können, und von Profis reden sollten. Und wenn wir von Profis reden, ist eine kurze Zeile Code DEUTLICH kompakter als viele Zeilen Java.

Zum Vergleich Java:

String tlds = "de at ch com org net eu fr de it ch es";

String[] parts = tlds.split(" ");
Set<String> set = new Set<String>();

for (String tld : tlds) {
    if (!tld.isEmtpy()) {
        set.add(tld.toLowerCase());
    }
}

String[] sorted = set.toArray(new String[set.size()]);
Arrays.sort(sorted);

System.out.println(StringUtils.join(sorted, ", "));

In so einem Fall bin ich immer froh, wenn ich zwischen verschiedenen Programmiersprachen wählen kann. Manchmal kommt man zwar nicht drum herum, aber wenn möglich, sollte man das optimale Werkzeug wählen! :)

Da ich auch - wie bereits erwähnt - sehr viel in reinem C und viel mit Assembler arbeitet möchte ich nochmal sagen, dass sich C++, Java, Python und C# mal ganz hinten anstellen sollten, wenn wir über Performance reden. Meine Arbeit ist es unter anderem, Algorithmen zu optimieren, die bereits in ihrer Ursprungssprache durch etliche Peer-Reviews von Profis absolut durchoptimiert wurden, aber die Performance dann immer noch nicht reicht.

An so einem Punkt muss man abwägen, ob man Zeit und Geld für weitere Optimierungen aufwenden will, die weniger gut wartbar sind, als der vorhandene Code, oder ob man einen möglichen Performancegewinn von Teilweise Faktor 1000 um jeden Preis haben möchte.

Meistens arbeite ich in so einem Falle mit Assembler und komme auf 5 bis 10 fache Geschwindigkeitssteigerung. Probleme, die sich gut optimieren lassen, mache ich auf modernen CPUs mit AVX, und da sind dann Steigerungen jenseits des Faktors 100 drin! (Manchmal über 1000!)

Da ich mir wegen meiner Arbeit auch fast täglich Disassemblate ansehe, (MSIL, Java, x86, x64, ARM, PIC, AVR, etc.) kann ich dir übrigens garantieren, dass Compiler dumm sind! Sie geben sich zwar immer große Mühe und optimieren fleißig auf Pipelining und Branchprediction, aber machen oft unglaublich dumme Sachen, die man rational nicht erklären kann. (was nicht selten richtige Bugs sind)

Im Gegensatz zu den meisten Programmierern, finde ich durch diese Herangehensweise im Schnitt ein bis vier Bugs pro Woche in diversen Compilern.

Also ... meistens ist es so, dass man entweder auf Performance, oder auf Wartbarkeit optimiert. Beides zusammen ist selten möglich, und meistens gibt man sich mit einem Mittelweg zufrieden. Ob dieser Mittelweg jetzt mehr in Wartbarkeit oder mehr in Performance geht, hängt von der jeweiligen Programmiersprache ab. Aber im Schnitt nehmen sich die meisten nicht viel, die in der Nähe residieren.

Am Ende bleibt nur der Vergleich zwischen Extremen (Assembler vs. Python), und alles andere (Java vs. Python) ist quatsch. :)

2

hallo grtgrt - das entscheiden nicht die (großen) Unternehmen, sondern die Softwareentwickler; viele benutzen beide Sprachen plus Ruby und PHP, da jede dieser Sprachen gute Funktionen beinhaltet. Inkscape und OpenOffice beinhaltet Python-Code neben Java. Die Benchmarks vergleichen nicht die Interpreter, sondern die Programmierung.

Ich für mich lehne Interpretersprachen ganz ab und arbeite nahezu ausschließlich in Objekt-Pascal-Umgebungen wie Embarcadero RAD Studio. Welche Sprache, das ist aber einfach eine subjektive Entscheidung.


grtgrt 
Beitragsersteller
 26.02.2015, 12:58

Na ja: Wenn von großen Unternehmen die Rede ist, dann haben die einen CIO, und der wacht ganz bestimmt darüber, dass in keinem Projekt, in dem Software fürs Unternehmen selbst entsteht, ohne triftigen Grund eine bislang von ihm nicht genehmigte, nicht wirklich notwendige Programmiersprache verwendet wird.

Und Python ist doch eigentlich nicht wirklich notwendig (auf jeden Fall aber weit weniger performant als Java oder C#, die man heute fast überall für Applikationsprogrammierung verwendet).

Warum aber wird dann dennoch so viel über Python gesprochen? Und warum hat z.B. OpenStack als Standard-Cloud-Betriebssystem ein Python API?

Das hätte ich gerne von jemand erklärt bekommen, der selbst -- aber nicht nur als Hobbyprogrammierer oder nur in einem winzig kleinen Unternehmen -- mit Python für seinen Arbeitgeber Programme schreibt.

0
TeeTier  27.02.2015, 05:55
@grtgrt
Na ja: Wenn von großen Unternehmen die Rede ist, dann haben die einen CIO, und der wacht ganz bestimmt darüber, dass in keinem Projekt, in dem Software fürs Unternehmen selbst entsteht, ohne triftigen Grund eine bislang von ihm nicht genehmigte, nicht wirklich notwendige Programmiersprache verwendet wird.

Das ist so, als würde in einem Handwerkerbetrieb der Chef darüber wachen, dass die Angestellten ausschließlich Hammer und Schraubenzieher benutzen dürfen, aber keine Bohrmaschine, keine Stechbeitel und schon gar keine Kneifzangen. :)

Davon abgesehen haben viele Chefs keine Ahnung von der Arbeit ihrer Angestellten, gerade im Softwarebereich sehe ich das immer wieder. (Dilbert lässt grüßen!)

Ich bin selber Chef einer Softwarefirma, und ich gebe bewusst keine Vorgaben im Bezug auf die Programmiersprache und Plattform. Wir haben hier für einige Hardwarekontrollen selbstentwickelte Platinen, setzen aber z. B. auch fertige Raspberry Pis ein. Einfach weil Zeit und Performance VÖLLIG unterschiedliche Anforderungen sind.

Da muss man als Chef abwägen und sollte sich nicht auf eine Sache versteifen, weil man die halt lieber mag. :)

Programmiert wird hier in seeeehr vielen Sprachen, und ich erwarte von meinen Angestellten auch ein gewisses Maß an Lernbereitschaft diesbezüglich. Wenn hier ein Bewerber kommt, der nur 5 Sprachen beherrscht, muss ich den leider wieder nach Hause schicken. Das reicht ganz einfach nicht. So jemand kann dann ja bei SAP, der Telekom, Siemens, oder wasauchimmer arbeiten ... andere Firmen, andere Anforderungen.

Aber Programmierer, die ihr Leben lang nur eine einzige Sprache benutzen, sind einfach nur bessere Code-Monkeys. Mehr nicht. Ohne ein fundiertes Wissen in mehreren Programmiersprachen, hat man einfach keinen guten Überblick. Das schließt sich faktisch aus. Ich denke, das erklärt sich von selbst. :)

Und Python ist doch eigentlich nicht wirklich notwendig ...

Leg die Scheuklappen ab, und wirf einen Blick über den Tellerrand! Was machst du, wenn du deine Applikation Skriptbar machen willst? Dann bindest du Lua in din C++ Programm ein, oder die Scripting-Engine in Java. Und dann? Dann hast du die Möglichkeit, deine Applikation zu scripten! Mehr nicht! Noch keine Kernfunktionen! Du musst alle Funktionen erst selber entwickeln, und deinem Scripting-Interface zur verfügung stellen.

Oder du bindest Python ein! Fertig. Das ist noch relativ leichtgewichtig, lässt sich abspecken oder aufstocken (je nach Anforderungen) und bringt eine ganze Reihe Funktionalitäten mit, die man erst Mühselig innerhalb von Wochen oder Monaten implementieren müsste. :)

Guck dir mal die 3D-Software Blender an. Die gesamte GUI, alle Interaktionen, alle Skripte sind in Python geschrieben. Ohne Python wäre Blender nur eiine Engine mit schwarzem Fenster. Python ist dort Omnipräsent und ALLES lässt sich dort mit Python automatisieren, anpassen, abändern, skripten, usw. Und das tollste ist, dass die Standard-Bibliothek zusätzlich zu den Blender Extensions ebenfalls zur Verfügung steht.

Du kannst also direkt in Blender einen kleinen Webserver programmieren, der auf Anfragen gescriptete Szenen in Echtzeit rendert und an den Client ausliefert. Und diese ganze Funktionalität umfasst nur wenige Zeilen Python-Code (Ich schätze mal weniger als 30). (Das hat das ZDF übrigens bei den letzten Bundestagswahlen so gemacht, um auf der Website die Hochrechnungen der Sitzverteilung interaktiv und aktuell zu halten!)

Warum aber wird dann dennoch so viel über Python gesprochen?

Weil Python eben einfach die BESSERE Programmiersprache für gewisse Anwendungsfälle ist. Ob du es glaubst oder nicht - Nein - du kannst nicht ALLES mit Java machen! Und genauso gibt es Situationen, in denen Java die BESSERE Programmiersprache ist, und man mit Python eben nicht ALLES machen kann. :)

So ist das Leben, und das wirst du - wohl oder übel - einsehen müssen! :)

Es gibt keine universell ideale Programmiersprache (kann es prinzipbedingt auch nicht geben)
Und warum hat z.B. OpenStack als Standard-Cloud-Betriebssystem ein Python API?

Siehe Blender-API ... es gibt keine andere Skriptbare erweiterung, die gleichzeitig so leichtgewichtig, performant, leicht erlernbar und mächtig ist wie Python. In Teilbereichen sei hier noch Lua oder Tcl erwähnt, aber die haben dann wieder an anderer Stelle (Vor- und) Nachteile.

Das hätte ich gerne von jemand erklärt bekommen, der selbst -- aber nicht nur als Hobbyprogrammierer oder nur in einem winzig kleinen Unternehmen -- mit Python für seinen Arbeitgeber Programme schreibt.

Außer "nur winzig kleines Unternehmen" trifft jeder einzelne Punkt zu. :)

Merk dir einfach die Analogie zu Hammer und Schraubenzieher bei einem Handwerksbetrieb. Für dein Einsatz von diesen Werkzeugen spielt die Größe des Unternehmens keine Rolle.

Eine Programmiersprache X ist nun mal für gewisse Dinge weniger gut geeignet, als Programmiersprache Y. Das ist immer auf allen Gebieten so! :)

2

Einfache Antwort: Weil der Chef es vorgibt. btw, Java gehört zu Oracle