Offensichtlich ist Python benutzerfreundlicher. Eine schnelle Suche bei Google zeigt viele Ergebnisse, die besagen, dass Python in Byte-Kompilierung normalerweise schneller ist. Ich fand auch dies , dass behauptet , dass Sie eine Verbesserung von über 2000% auf Wörterbuch-basierten Operationen zu sehen.
Welche Erfahrungen haben Sie in dieser Angelegenheit gemacht? In welcher Art von Aufgabe ist jeder ein klarer Gewinner?
python
performance
bash
Doppelgänger
quelle
quelle
Antworten:
Typischer Mainframe-Fluss ...
Typischer Linux-Flow ...
Shells sind der Klebstoff von Linux
Linux-Shells wie sh / ksh / bash / ... bieten Eingabe- / Ausgabe- / Flusssteuerungs-Bezeichnungsfunktionen, ähnlich wie die alte Mainframe-Jobsteuerungssprache ... aber auf Steroiden! Sie sind Turing komplette Sprachen erstellen eigenständige und sind optimiert, um Daten und Kontrolle effizient an und von anderen ausführenden Prozessen weiterzuleiten, die in einer beliebigen Sprache geschrieben sind, die das Betriebssystem unterstützt.
Die meisten Linux-Anwendungen, unabhängig davon, in welcher Sprache der Großteil des Programms geschrieben ist, hängen von Shell-Skripten ab, und Bash ist die am häufigsten verwendete. Durch Klicken auf ein Symbol auf dem Desktop wird normalerweise ein kurzes Bash- Skript ausgeführt. Dieses Skript weiß entweder direkt oder indirekt, wo sich alle benötigten Dateien befinden, legt Variablen und Befehlszeilenparameter fest und ruft schließlich das Programm auf. Das ist die einfachste Verwendung einer Shell.
Linux, wie wir es kennen, wäre jedoch kaum Linux ohne die Tausenden von Shell-Skripten, die das System starten, auf Ereignisse reagieren, Ausführungsprioritäten steuern und Programme kompilieren, konfigurieren und ausführen. Viele davon sind ziemlich groß und komplex.
Shells bieten eine Infrastruktur, mit der wir vorgefertigte Komponenten verwenden können, die zur Laufzeit miteinander verbunden sind, anstatt zur Kompilierungszeit. Diese Komponenten sind eigenständige Programme, die allein oder in anderen Kombinationen ohne Neukompilierung verwendet werden können. Die Syntax zum Aufrufen ist nicht von der eines eingebauten Bash- Befehls zu unterscheiden, und es gibt tatsächlich zahlreiche eingebaute Befehle, für die es auch eine eigenständige ausführbare Datei auf dem System gibt, die häufig zusätzliche Optionen bietet.
Es gibt keinen sprachweiten Unterschied zwischen Python und Bash in der Leistung. Es hängt ganz davon ab, wie jedes codiert ist und welche externen Tools aufgerufen werden.
Jedes der bekannten Werkzeuge wie awk, sed, grep, bc, dc, tr usw. lässt diese Operationen in beiden Sprachen im Staub liegen. Bash wird dann für alles ohne grafische Benutzeroberfläche bevorzugt, da es einfacher und effizienter ist, Daten von einem Tool wie dem mit Bash als Python aufzurufen und zurückzugeben .
Performance
Es hängt davon ab, welche Programme das Bash- Shell-Skript aufruft und welche Eignung sie für die Unteraufgabe haben, ob der Gesamtdurchsatz und / oder die Reaktionsfähigkeit besser oder schlechter als das entsprechende Python sind . Um die Sache zu verkomplizieren, kann Python , wie die meisten Sprachen, auch andere ausführbare Dateien aufrufen, obwohl es umständlicher ist und daher nicht so häufig verwendet wird.
Benutzeroberfläche
Ein Bereich, in dem Python der klare Gewinner ist, ist die Benutzeroberfläche. Dies macht es zu einer hervorragenden Sprache für die Erstellung lokaler oder Client-Server-Anwendungen, da es GTK-Grafiken nativ unterstützt und weitaus intuitiver als Bash ist .
Bash versteht nur Text. Andere Tools müssen für eine GUI aufgerufen und Daten von ihnen zurückgegeben werden. Ein Python- Skript ist eine Option. Schnellere, aber weniger flexible Optionen sind die Binärdateien wie YAD, Zenity und GTKDialog .
Während Shells wie Bash gut mit GUIs wie Yad , GtkDialog (eingebettete XML-ähnliche Schnittstelle zu GTK + -Funktionen) , Dialog und xmessage funktionieren , ist Python viel leistungsfähiger und daher besser für komplexe GUI-Fenster.
Zusammenfassung
Das Erstellen mit Shell-Skripten ähnelt dem Zusammenstellen eines Computers mit Standardkomponenten wie Desktop-PCs.
Das Bauen mit Python , C ++ oder den meisten anderen Sprachen ähnelt eher dem Bauen eines Computers durch Löten der Chips (Bibliotheken) und anderer elektronischer Teile wie Smartphones.
Die besten Ergebnisse werden normalerweise durch die Verwendung einer Kombination von Sprachen erzielt, in denen jeder das tun kann, was er am besten kann. Ein Entwickler nennt dies " polyglotte Programmierung ".
quelle
Im Allgemeinen funktioniert Bash nur in Umgebungen, in denen Python nicht verfügbar ist, besser als Python. :) :)
Im Ernst, ich muss mich täglich mit beiden Sprachen auseinandersetzen und werde Python sofort über Bash nehmen, wenn ich die Wahl habe. Leider bin ich gezwungen, Bash auf bestimmten "kleinen" Plattformen zu verwenden, weil jemand (fälschlicherweise IMHO) entschieden hat, dass Python "zu groß" ist, um zu passen.
Während es stimmt, dass Bash für einige ausgewählte Aufgaben schneller als Python ist, kann es niemals so schnell entwickelt oder gewartet werden (zumindest nachdem Sie 10 Codezeilen oder so überschritten haben). Bashs einzige Stärke in Bezug auf Python oder Rubin oder Lua usw. ist seine Allgegenwart.
quelle
os
odershutil
Modulbefehle.Die Entwicklereffizienz ist für mich in Szenarien, in denen sowohl Bash als auch Python eine sinnvolle Wahl sind, viel wichtiger.
Einige Aufgaben eignen sich gut zum Schlagen, andere für Python. Es ist auch nicht ungewöhnlich, dass ich etwas als Bash-Skript starte und es in Python ändere, während es sich über mehrere Wochen entwickelt.
Ein großer Vorteil von Python liegt in Eckfällen in Bezug auf die Behandlung von Dateinamen, während es Glob , Shutil , Subprozess und andere für allgemeine Skriptanforderungen enthält .
quelle
Beim Schreiben von Skripten spielt die Leistung keine Rolle (in den meisten Fällen).
Wenn Sie sich für die Leistung interessieren, ist 'Python vs Bash' eine falsche Frage.
Python :
+ einfacher zu schreiben
+ einfacher zu warten
+ einfachere Wiederverwendung von Code (versuchen Sie, einen universellen, fehlerfreien Weg zu finden, um Dateien mit allgemeinem Code aufzunehmen
sh
, ich wage Sie)+ Sie können auch OOP damit machen!
+ einfacheres Parsen von Argumenten. Nun, nicht einfacher, genau. es wird immer noch zu wortreich für meinen Geschmack sein, aber Python hat eine
argparse
eingebaute Einrichtung.- hässlicher hässlicher "Unterprozess". Versuchen Sie, Befehle zu verketten und keinen Fluss zu weinen, wie hässlich Ihr Code wird. vor allem, wenn Sie sich für Exit-Codes interessieren.
Bash :
+ Allgegenwart, wie bereits gesagt.
+ einfache Verkettung von Befehlen. So kleben Sie auf einfache Weise verschiedene Befehle zusammen. Auch
Bash
(nichtsh
) haben einige Verbesserungen, wiepipefail
, so dass die Verkettung wirklich kurz und ausdrucksstark ist.+ Es müssen keine Programme von Drittanbietern installiert werden. kann sofort ausgeführt werden.
- Gott, es ist voller Fallstricke. IFS, CDPATH .. Tausende von ihnen.
Wenn Sie ein Skript schreiben, das größer als 100 LOC ist: Wählen Sie Python.
Wenn Sie eine Pfadmanipulation im Skript benötigen: Wählen Sie Python. (3)
Wenn Sie etwas Ähnliches,
alias
aber etwas Kompliziertes benötigen : Wählen Sie Bash / shAuf jeden Fall sollte man beide Seiten versuchen, sich ein Bild davon zu machen, wozu sie fähig sind.
Vielleicht kann die Antwort mit Verpackungs- und IDE-Unterstützungspunkten erweitert werden, aber ich bin mit diesen Seiten nicht vertraut.
Wie immer muss man zwischen Turd Sandwich und Riesendusche wählen. Und denken Sie daran, vor ein paar Jahren war Perl eine neue Hoffnung. Wo es jetzt ist.
quelle
In Bezug auf die Leistung übertrifft Bash Python in der Prozessstartzeit.
Hier sind einige Messungen von meinem i7-Laptop mit Linux Mint:
* Von Python geladene Bibliotheken sind: os, os.path, json, time, request, threading, subprocess
Dies zeigt einen großen Unterschied, jedoch verkürzt sich die Bash-Ausführungszeit schnell, wenn etwas Sinnvolles getan werden muss, da normalerweise externe Prozesse aufgerufen werden müssen.
Wenn Sie Wert auf Leistung legen, verwenden Sie bash nur für:
quelle
/bin/echo
übertrifft Bash um eine solche Größenordnung, dass es schwer zu messen ist. Anstatt bash/bin/echo mycommand > named_pipe
auszuführen , können Sie also (Befehle / Nachrichten an eine Named Pipe oder einen Socket ausgeben) ... verwenden und einen Python-Hintergrundprozess haben, der Befehle / Anweisungen aus dieser Pipe liest und ausführt. Bash ist also keine wirklich gute "Startkostenoptimierung".Bash ist in erster Linie eine Batch- / Shell-Skriptsprache mit weitaus geringerer Unterstützung für verschiedene Datentypen und allerlei Macken in Bezug auf Kontrollstrukturen - ganz zu schweigen von Kompatibilitätsproblemen.
Welche ist schneller? Weder noch, weil Sie hier nicht Äpfel mit Äpfeln vergleichen. Wenn Sie eine ASCII-Textdatei sortieren mussten und Tools wie zcat, sort, uniq und sed verwendeten, rauchen Sie Python in Bezug auf die Leistung.
Wenn Sie jedoch eine geeignete Programmierumgebung benötigen, die Gleitkomma und verschiedene Steuerungsabläufe unterstützt, gewinnt Python zweifellos. Wenn Sie beispielsweise einen rekursiven Algorithmus in Bash und Python geschrieben haben, gewinnt die Python-Version in einer Größenordnung oder mehr.
quelle
Wenn Sie ein schnelles Dienstprogramm mit minimalem Aufwand zusammenschustern möchten, ist bash gut. Für einen Wrapper um eine Anwendung ist Bash von unschätzbarem Wert.
Alles, was Sie dazu bringt, immer wieder Verbesserungen vorzunehmen, ist wahrscheinlich (wenn auch nicht immer) besser für eine Sprache wie Python geeignet, da die Pflege von Bash-Code mit mehr als 1000 Zeilen sehr schmerzhaft wird. Bash-Code ist auch irritierend beim Debuggen, wenn es lang wird .......
Ein Teil des Problems bei solchen Fragen besteht meiner Erfahrung nach darin, dass Shell-Skripte normalerweise alle benutzerdefinierten Aufgaben sind. Es gab nur sehr wenige Shell-Scripting-Aufgaben, auf die ich gestoßen bin, bei denen es bereits eine frei verfügbare Lösung gibt.
quelle
Es gibt zwei Szenarien, in denen die Bash-Leistung meiner Meinung nach mindestens gleich ist:
Trotzdem beschäftige ich mich normalerweise nicht wirklich mit der Leistung der Skriptsprache selbst. Wenn die Leistung ein echtes Problem ist, schreiben Sie kein Skript, sondern programmieren (möglicherweise in Python).
quelle
Ich poste diese späte Antwort hauptsächlich, weil Google diese Frage mag.
Ich glaube, das Problem und der Kontext sollten sich wirklich auf den Workflow beziehen, nicht auf die Tools. Die allgemeine Philosophie lautet immer: "Verwenden Sie das richtige Werkzeug für den Job." Aber bevor dies kommt, vergessen viele oft, wenn sie sich in den Werkzeugen verlieren: "Erledige die Arbeit."
Wenn ich ein Problem habe, das nicht vollständig definiert ist, beginne ich fast immer mit Bash. Ich habe einige knorrige Probleme in großen Bash-Skripten gelöst, die sowohl lesbar als auch wartbar sind.
Aber wann beginnt das Problem zu überschreiten, was Bash tun sollte? Ich habe einige Schecks, mit denen ich gewarnt werde:
Die Liste geht weiter. Fazit: Wenn Sie härter daran arbeiten, Ihre Skripte am Laufen zu halten, während Sie Funktionen hinzufügen, ist es Zeit, Bash zu verlassen.
Nehmen wir an, Sie haben beschlossen, Ihre Arbeit nach Python zu verlagern. Wenn Ihre Bash-Skripte sauber sind, ist die anfängliche Konvertierung recht einfach. Es gibt sogar mehrere Konverter / Übersetzer, die den ersten Durchgang für Sie erledigen.
Die nächste Frage lautet: Was geben Sie auf, zu Python zu wechseln?
Alle Aufrufe an externe Dienstprogramme müssen in etwas aus dem
subprocess
Modul (oder einem gleichwertigen Element) eingeschlossen sein. Es gibt mehrere Möglichkeiten, dies zu tun, und bis 3.7 waren einige Anstrengungen erforderlich, um es richtig zu machen (3.7 wurde verbessertsubprocess.run()
, um alle gängigen Fälle selbst zu behandeln).Überraschenderweise verfügt Python über kein plattformunabhängiges Standard-Nichtblockierungsdienstprogramm (mit Zeitüberschreitung) zum Abrufen der Tastatur (stdin). Der Bash-
read
Befehl ist ein großartiges Tool für die einfache Benutzerinteraktion. Am häufigsten zeige ich einen Spinner, bis der Benutzer eine Taste drückt, und führe gleichzeitig eine Abfragefunktion aus (bei jedem Spinner-Schritt), um sicherzustellen, dass die Dinge noch gut laufen. Dies ist ein schwierigeres Problem, als es zunächst erscheinen würde, daher rufe ich oft einfach bei Bash an: Teuer, aber es macht genau das, was ich brauche.Wenn Sie auf einem eingebetteten oder speicherbeschränkten System entwickeln, kann der Speicherbedarf von Python um ein Vielfaches größer sein als der von Bash (abhängig von der jeweiligen Aufgabe). Außerdem befindet sich fast immer bereits eine Instanz von Bash im Speicher, was bei Python möglicherweise nicht der Fall ist.
Bei Skripten, die einmal ausgeführt werden und schnell beendet werden, kann die Startzeit von Python viel länger sein als die von Bash. Wenn das Skript jedoch wichtige Berechnungen enthält, wird Python schnell weiterentwickelt.
Python verfügt über das umfassendste Paketsystem der Welt. Wenn Bash noch etwas komplexer wird, hat Python wahrscheinlich ein Paket, mit dem ganze Teile von Bash zu einem einzigen Aufruf werden. Das Finden der richtigen Pakete ist jedoch der größte und entmutigendste Teil, um ein Pythonista zu werden. Glücklicherweise sind Google und StackExchange Ihre Freunde.
quelle
Ich weiß nicht, ob dies korrekt ist, aber ich habe festgestellt, dass Python / Ruby für Skripte mit vielen mathematischen Berechnungen viel besser funktioniert. Andernfalls müssen Sie einen
dc
anderen "beliebigen Präzisionsrechner" verwenden. Es wird einfach ein sehr großer Schmerz. Mit Python haben Sie viel mehr Kontrolle über Floats und Ints und es ist viel einfacher, viele Berechnungen durchzuführen und manchmal.Insbesondere würde ich niemals mit einem Bash-Skript arbeiten, um binäre Informationen oder Bytes zu verarbeiten. Stattdessen würde ich so etwas wie Python (vielleicht) oder C ++ oder sogar Node.JS verwenden.
quelle
In Bezug auf die Leistung können beide gleichermaßen das Gleiche tun, sodass sich die Frage stellt, was mehr Entwicklungszeit spart.
Bash ist darauf angewiesen, andere Befehle aufzurufen und sie zum Erstellen neuer Befehle weiterzuleiten. Dies hat den Vorteil, dass Sie schnell neue Programme erstellen können, nur mit dem Code, der von anderen Personen ausgeliehen wurde, unabhängig davon, welche Programmiersprache sie verwendet haben.
Dies hat auch den Nebeneffekt, dass Änderungen in Unterbefehlen ziemlich gut widerstanden werden, da die Schnittstelle zwischen ihnen nur einfacher Text ist.
Außerdem ist Bash sehr freizügig, wie man darauf schreiben kann. Dies bedeutet, dass es für eine größere Vielfalt von Kontexten gut funktioniert, aber es hängt auch davon ab, dass der Programmierer die Absicht hat, sauber und sicher zu codieren. Andernfalls hindert Sie Bash nicht daran, ein Chaos aufzubauen.
Python ist strukturierter strukturiert, sodass ein unordentlicher Programmierer nicht so unordentlich ist. Es funktioniert auch auf Betriebssystemen außerhalb von Linux, sodass es sofort besser geeignet ist, wenn Sie diese Art von Portabilität benötigen.
Das Aufrufen anderer Befehle ist jedoch nicht so einfach. Wenn Ihr Betriebssystem also Unix ist, werden Sie feststellen, dass die Entwicklung auf Bash der schnellste Weg ist, um zu entwickeln.
Wann man Bash benutzt:
Wann man Python benutzt:
quelle