Python vs Bash: in che tipo di attività ognuno supera l'altro in termini di prestazioni?


97

Ovviamente Python è più user friendly, una rapida ricerca su google mostra molti risultati che dicono che, poiché Python è compilato per byte, di solito è più veloce. Ho anche trovato questo che afferma che puoi vedere un miglioramento di oltre il 2000% nelle operazioni basate sul dizionario.

Qual è la tua esperienza in merito? In quale tipo di compito ognuno è un chiaro vincitore?


6
Questo non è in realtà un sondaggio, non ci sono opzioni predefinite, ho bisogno di un'idea di quale strumento fa il tipo di lavoro migliore.
Doppelganger

Risposte:


94

Flusso tipico del mainframe ...

Input Disk/Tape/User (runtime) --> Job Control Language (JCL) --> Output Disk/Tape/Screen/Printer
                                   |                          ^
                                   v                          |
                                   `--> COBOL Program --------' 

Flusso tipico di Linux ...

Input Disk/SSD/User (runtime) --> sh/bash/ksh/zsh/... ----------> Output Disk/SSD/Screen/Printer
                                   |                          ^
                                   v                          |
                                   `--> Python script --------'
                                   |                          ^
                                   v                          |
                                   `--> awk script -----------'
                                   |                          ^
                                   v                          |
                                   `--> sed script -----------'
                                   |                          ^
                                   v                          |
                                   `--> C/C++ program --------'
                                   |                          ^
                                   v                          |
                                   `--- Java program ---------'
                                   |                          ^
                                   v                          |
                                   :                          :

Le conchiglie sono il collante di Linux

Le shell Linux come sh / ksh / bash / ... forniscono servizi di designazione di input / output / controllo del flusso molto simili al vecchio linguaggio di controllo del lavoro per mainframe ... ma con gli steroidi! Sono linguaggi completi di Turing a tutti gli effetti, ottimizzati per passare in modo efficiente i dati e il controllo da e verso altri processi di esecuzione scritti in qualsiasi lingua supportata dal sistema operativo.

La maggior parte delle applicazioni Linux, indipendentemente dalla lingua in cui è scritto il grosso del programma, dipendono dagli script della shell e Bash è diventato il più comune. Facendo clic su un'icona sul desktop di solito viene eseguito un breve script Bash . Quello script, direttamente o indirettamente, sa dove si trovano tutti i file necessari e imposta variabili e parametri della riga di comando, chiamando infine il programma. Questo è l'uso più semplice di una shell.

Linux come lo conosciamo, tuttavia, difficilmente sarebbe Linux senza le migliaia di script di shell che avviano il sistema, rispondono agli eventi, controllano le priorità di esecuzione e compilano, configurano ed eseguono programmi. Molti di questi sono piuttosto grandi e complessi.

Le shell forniscono un'infrastruttura che ci consente di utilizzare componenti precostruiti collegati tra loro in fase di esecuzione anziché in fase di compilazione. Quei componenti sono programmi indipendenti a sé stanti che possono essere usati da soli o in altre combinazioni senza ricompilare. La sintassi per chiamarli è indistinguibile da quella di un comando integrato di Bash , e ci sono infatti numerosi comandi incorporati per i quali esiste anche un eseguibile autonomo sul sistema, spesso con opzioni aggiuntive.

Non vi è alcuna differenza a livello di linguaggio tra Python e Bash in termini di prestazioni. Dipende interamente da come ciascuno di essi è codificato e quali strumenti esterni vengono chiamati.

Uno qualsiasi degli strumenti ben noti come awk, sed, grep, bc, dc, tr, ecc. Lascerà queste operazioni nella polvere in entrambe le lingue. Bash è quindi preferito per qualsiasi cosa senza un'interfaccia utente grafica poiché è più facile ed efficiente chiamare e passare i dati da uno strumento come quelli con Bash che con Python .

Prestazione

Dipende da quali programmi lo script della shell Bash chiama e dalla loro idoneità per la sottoattività loro assegnata se il throughput e / o la reattività complessivi saranno migliori o peggiori dell'equivalente Python . Per complicare le cose Python , come la maggior parte dei linguaggi, può anche chiamare altri eseguibili, sebbene sia più ingombrante e quindi non così spesso utilizzato.

Interfaccia utente

Un'area in cui Python è il chiaro vincitore è l'interfaccia utente. Ciò lo rende un linguaggio eccellente per la creazione di applicazioni locali o client-server poiché supporta nativamente la grafica GTK ed è molto più intuitivo di Bash .

Bash capisce solo il testo. Altri strumenti devono essere chiamati per una GUI e i dati sono passati indietro da loro. Uno script Python è un'opzione. Opzioni più veloci ma meno flessibili sono i binari come YAD, Zenity e GTKDialog .

Mentre shell come Bash funzionano bene con GUI come Yad , GtkDialog (interfaccia simile a XML incorporata per le funzioni GTK +) , dialog e xmessage , Python è molto più capace e quindi migliore per finestre GUI complesse.

Sommario

Costruire con gli script della shell è come assemblare un computer con componenti standard come sono i PC desktop.

Costruire con Python , C ++ o quasi tutti gli altri linguaggi è più come costruire un computer saldando i chip (librerie) e altre parti elettroniche insieme come sono gli smartphone.

I migliori risultati si ottengono solitamente utilizzando una combinazione di lingue in cui ciascuna può fare ciò che sa fare meglio. Uno sviluppatore chiama questa " programmazione poliglotta ".


16
Non riesco a riconoscere come possa essere accettata la risposta. Non fornisce informazioni su quali attività questi due sono più adatti.
vigilante

2
@vigilancer Spero che le modifiche e le aggiunte appena pubblicate siano utili.
DocSalvager

1
Anche se sono d'accordo con altri commenti, questo non risponde esattamente alla domanda. Questa è una delle migliori risposte che abbia mai letto!
Jim Mitchener,

72

In generale, bash funziona meglio di python solo in quegli ambienti in cui python non è disponibile. :)

Seriamente, ho a che fare con entrambe le lingue quotidianamente e prenderò immediatamente Python su bash se mi viene data la scelta. Ahimè, sono costretto a usare bash su alcune piattaforme "piccole" perché qualcuno ha (erroneamente, IMHO) deciso che python è "troppo grande" per adattarsi.

Sebbene sia vero che bash potrebbe essere più veloce di python per alcune attività selezionate, non può mai essere così veloce da sviluppare o altrettanto facile da mantenere (almeno dopo aver superato 10 righe di codice o giù di lì). L'unico punto di forza di Bash rispetto a Python o Ruby o Lua, ecc., È la sua ubiquità.


4
Python non è già su ogni Linux / Unix, anche su MacOS? Sono curioso di sapere quali operazioni siano più veloci in bash: da quello che ho capito, il suo richiamo di diversi comandi separati lo rende molto più lento dei comandi di Python oso del shutilmodulo.
NoBugs

1
@NoBugs Sicuramente non sarebbe su ogni singola distribuzione Linux / Unix. Quasi certamente è disponibile su tutte le principali distribuzioni Linux (ad es. Distribuzioni basate su Debian, slackware, ecc.) E Mac OS X, tuttavia, se costruisci il tuo iso con yocto ( yoctoproject.org ), allora non potresti averlo, poiché personalizzi tu stesso ogni pacchetto. Ma è probabilmente sicuro affermare che per ogni principale sistema operativo Unix al giorno d'oggi, verrà installato con python2 (almeno) e forse anche python3.
dylnmc

Python è un eccellente linguaggio di scripting per attività complesse come una GUI completa. Altrettanto importante, impone buone pratiche di programmazione in modo che i programmi siano più facili da mantenere. Bash richiede l'imposizione di buone pratiche apprese altrove per essere mantenibile. In tal modo, e utilizzando un'utilità di dialogo GUI o Python per l'interfaccia utente, si ottengono prestazioni superiori (tramite programmi di utilità estremamente veloci chiamati da Bash) e una buona UX.
DocSalvager

34

L'efficienza degli sviluppatori conta molto di più per me in scenari in cui sia bash che Python sono scelte sensate.

Alcune attività si prestano bene a bash e altre a Python. Inoltre, non è insolito per me iniziare qualcosa come uno script bash e cambiarlo in Python mentre si evolve nell'arco di diverse settimane.

Un grande vantaggio che Python ha è nei casi d'angolo intorno alla gestione dei nomi di file, mentre ha glob , shutil , subprocess e altri per esigenze di scripting comuni.


5
La domanda mirava al confronto "dal punto di vista delle prestazioni" che implica le prestazioni della macchina e non le prestazioni dello sviluppatore. Vedi i miei test sulle prestazioni in un'altra risposta.
Grzegorz Luczywo

25

Quando si scrivono script, le prestazioni non sono importanti (nella maggior parte dei casi).
Se ti interessano le prestazioni, "Python vs Bash" è una domanda falsa.

Python :
+ più facile da scrivere
+ più facile da mantenere
+ più facile riutilizzo del codice (prova a trovare un modo universale a prova di errore per includere file con codice comune in sh, ti sfido)
+ puoi anche fare OOP con esso!
+ analisi più semplice degli argomenti. beh, non è più facile, esattamente. sarà ancora troppo prolisso per i miei gusti, ma python ha una argparsestruttura incorporata.
- "sottoprocesso" brutto brutto. prova a concatenare i comandi e non gridare al fiume quanto diventerà brutto il tuo codice. soprattutto se ti interessano i codici di uscita.

Bash :
+ ubiquità, come è stato detto prima, in effetti.
+ semplici comandi concatenati. è così che incolli insieme diversi comandi in modo semplice. Inoltre Bash(non sh) hanno alcuni miglioramenti, come pipefail, quindi il concatenamento è davvero breve ed espressivo.
+ non richiede l'installazione di programmi di terze parti. può essere eseguito immediatamente.
- Dio, è pieno di trucchi. IFS, CDPATH .. migliaia di loro.

Se si scrive uno script più grande di 100 LOC: scegliere Python
Se è necessario manipolare il percorso nello script: scegliere Python (3)
Se è necessario qualcosa di simile aliasma leggermente complicato: scegliere Bash / sh

Ad ogni modo, si dovrebbe provare entrambe le parti per avere l'idea di cosa sono capaci.

Forse la risposta può essere estesa con pacchetti e punti di supporto IDE, ma non ho familiarità con questi lati.

Come sempre devi scegliere tra sandwich allo stronzo e doccia gigante. E ricorda, solo pochi anni fa Perl era una nuova speranza. Dov'è adesso.


4
Sì, un codice con bash vive per sempre. Ho codificato molto Perl, ora sono inutili.
Raymond gsh

Solo per prospettiva ... L'attuale più grande script che ho scritto, che uso tutto il giorno ogni giorno, pesa 4121 righe di codice bash effettivo, senza commenti o con riga vuota. Con i commenti estesi e simili, rende 7261 linee. È accompagnato da un file di aiuto di documenti simili a pagine di manuale per ogni funzione che è altre 6650 righe. Ogni funzione ha un'opzione che può immediatamente recuperare e visualizzare il testo della guida nella migliore forma di output disponibile che attualmente include 3 versioni di YAD, Zenity, dialog o solo un semplice testo CLI. Lo chiamo "kit". è sulla versione 44 al momento della stesura di questo documento.
DocSalvager

Questo è pesante! (c)
vigilante

1
Non credo che LoC sia davvero il fattore decisivo per scegliere Python. Inoltre, quanto è complesso il compito che stai svolgendo? Se stai solo concatenando 100 comandi probabilmente va bene, se è solo 30 LoC in bash ma potrebbe essere più facile da capire in Python, usa python.
JFord

@Akito va bene, quando niente lo tocca. ma ci sono alcune situazioni in cui le cose potrebbero andare storte. l'hai impostato come non predefinito e ti sei dimenticato di cancellarlo. qualcosa al di fuori lo ha cambiato, ma il tuo script si basa sul valore predefinito e così via. bisogna sempre tenere a mente IFS, perché alcuni strumenti lo usano implicitamente.
vigilante

22

Bash dal punto di vista delle prestazioni supera Python nel tempo di avvio del processo.

Ecco alcune misurazioni dal mio laptop i7 principale con Linux Mint:

Starting process                       Startup time

empty /bin/sh script                   1.7 ms
empty /bin/bash script                 2.8 ms
empty python script                    11.1 ms
python script with a few libs*         110 ms

* Le librerie caricate in Python sono: os, os.path, json, time, requests, threading, subprocess

Questo mostra un'enorme differenza, tuttavia il tempo di esecuzione di bash degrada rapidamente se deve fare qualcosa di sensato poiché di solito deve chiamare processi esterni.

Se ti interessano le prestazioni usa bash solo per:

  • script molto semplici e spesso chiamati
  • script che chiamano principalmente altri processi
  • quando hai bisogno di un attrito minimo tra le azioni amministrative manuali e lo scripting, controlla velocemente alcuni comandi e inseriscili nel file.sh

... e /bin/echosupera bash di una tale entità, è difficile da misurare. Quindi, invece di eseguire bash, puoi usare /bin/echo mycommand > named_pipe(comandi / messaggi di output su una pipe o socket denominati) ... e avere un processo Python in background che legge i comandi / istruzioni da quel pipe e li esegue. Quindi bash non è davvero una buona "ottimizzazione dei costi di avvio".
Cezary Baginski

Di solito dovresti usare i thread invece dei processi quando l'attività è veramente breve e veloce. Più processi sono una cosa di alto livello e fintanto che avviarne uno è entro mezzo secondo, sembra abbastanza ragionevole per la maggior parte, non credi?
Timothy Swan

16

Bash è principalmente un linguaggio di scripting batch / shell con molto meno supporto per vari tipi di dati e tutti i tipi di stranezze sulle strutture di controllo, per non parlare dei problemi di compatibilità.

Quale è più veloce? Né, perché qui non stai confrontando le mele con le mele. Se dovessi ordinare un file di testo ascii e stavi usando strumenti come zcat, sort, uniq e sed, fumerai Python in termini di prestazioni.

Tuttavia, se hai bisogno di un ambiente di programmazione adeguato che supporti il ​​punto mobile e vari flussi di controllo, Python vince a mani basse. Se hai scritto diciamo un algoritmo ricorsivo in Bash e Python, la versione Python vincerà in un ordine di grandezza o più.


13
Quindi l'intera morale del mio sproloquio è: usa lo strumento giusto per il lavoro giusto.
Justin

2
il virgola mobile è supportato con strumenti come awk, bc e con shell come zsh / ksh, quindi perché dici che Python vince a mani basse?
ghostdog74

4
Perché quegli strumenti non sono Bash. Stavo evidenziando una netta differenza. Questi strumenti sono usati in uno script di shell, ma lo stesso Bash nativo non supporta la virgola mobile.
Justin

2
No. Prova tu stesso. gzip un file di registro di grandi dimensioni e usa zcat, sort, ecc. per filtrare e quindi utilizzare le librerie native di Python. È notevolmente più veloce utilizzando gli strumenti nativi.
Justin

6
@justin, sì, questi strumenti non sono Bash ma esistono fin dai tempi antichi e sono spesso usati negli script di shell. se vuoi la virgola mobile, usa awk / bc. È una combinazione di questi strumenti che rendono lo scripting della shell potente quanto Python.
ghostdog74

12

Se stai cercando di mettere insieme un'utilità rapida con il minimo sforzo, bash è buono. Per un wrapper attorno a un'applicazione, bash è inestimabile.

Tutto ciò che potrebbe farti tornare più volte per aggiungere miglioramenti è probabilmente (anche se non sempre) più adatto a un linguaggio come Python poiché il codice Bash che comprende oltre 1000 righe diventa molto difficile da mantenere. Il codice Bash è anche irritante per eseguire il debug quando diventa lungo .......

Parte del problema con questo tipo di domande è, dalla mia esperienza, che gli script di shell sono di solito tutte attività personalizzate. Ci sono state pochissime attività di scripting della shell in cui mi sono imbattuto in cui esiste già una soluzione disponibile gratuitamente.


8

Ci sono 2 scenari in cui le prestazioni di Bash sono almeno uguali, credo:

  • Scripting delle utilità della riga di comando
  • Script la cui esecuzione richiede poco tempo; dove l'avvio dell'interprete Python richiede più tempo dell'operazione stessa

Detto questo, di solito non mi preoccupo davvero delle prestazioni del linguaggio di scripting stesso. Se le prestazioni sono un vero problema, non scrivi ma programmi (possibilmente in Python).


4

Sto postando questa risposta in ritardo principalmente perché a Google piace questa domanda.

Credo che il problema e il contesto dovrebbero davvero riguardare il flusso di lavoro, non gli strumenti. La filosofia generale è sempre "Usa lo strumento giusto per il lavoro". Ma prima ne arriva uno che molti spesso dimenticano quando si perdono tra gli strumenti: "Porta a termine il lavoro".

Quando ho un problema che non è completamente definito, inizio quasi sempre con Bash. Ho risolto alcuni problemi nodosi in grandi script Bash che sono leggibili e gestibili.

Ma quando il problema inizia a superare quello che dovrebbe essere chiesto di fare a Bash? Ho alcuni controlli che utilizzo per ricevere avvisi:

  1. Vorrei che Bash avesse array 2D (o superiori)? Se sì, è tempo di rendersi conto che Bash non è un ottimo linguaggio per l'elaborazione dei dati.
  2. Sto facendo più lavoro nella preparazione dei dati per altre utilità di quanto non stia effettivamente eseguendo quelle utilità? Se sì, è tempo di rendersi conto che Bash non è un ottimo linguaggio per l'elaborazione dei dati.
  3. Il mio script sta semplicemente diventando troppo grande per essere gestito? Se sì, è importante rendersi conto che mentre Bash può importare librerie di script, manca un sistema di pacchetti come altri linguaggi. È davvero un linguaggio "personale" rispetto alla maggior parte degli altri. Inoltre, ha un'enorme quantità di funzionalità integrate (alcuni dicono troppo ...)

L'elenco potrebbe continuare. In conclusione, quando lavori più duramente per mantenere in esecuzione i tuoi script che aggiungi funzionalità, è ora di lasciare Bash.

Supponiamo che tu abbia deciso di spostare il tuo lavoro in Python. Se i tuoi script Bash sono puliti, la conversione iniziale è abbastanza semplice. Ci sono anche diversi convertitori / traduttori che faranno il primo passaggio per te.

La domanda successiva è: a cosa rinunci a passare a Python?

  1. Tutte le chiamate a utilità esterne devono essere racchiuse in qualcosa dal subprocessmodulo (o equivalente). Ci sono diversi modi per farlo e fino alla 3.7 ci sono voluti alcuni sforzi per farlo bene (3.7 migliorato subprocess.run()per gestire tutti i casi comuni da solo).

  2. Sorprendentemente, Python non ha un'utilità di non blocco indipendente dalla piattaforma standard (con timeout) per il polling della tastiera (stdin). Il readcomando Bash è uno strumento fantastico per una semplice interazione con l'utente. Il mio uso più comune è mostrare uno spinner fino a quando l'utente non preme un tasto, mentre esegue anche una funzione di polling (con ogni passaggio dello spinner) per assicurarsi che le cose funzionino ancora bene. Questo è un problema più difficile di quanto sembrerebbe all'inizio, quindi spesso faccio semplicemente una chiamata a Bash: costoso, ma fa esattamente quello che mi serve.

  3. Se stai sviluppando su un sistema incorporato o con vincoli di memoria, l'impronta di memoria di Python può essere molte volte più grande di quella di Bash (a seconda dell'attività da svolgere). Inoltre, c'è quasi sempre un'istanza di Bash già in memoria, il che potrebbe non essere il caso di Python.

  4. Per gli script che vengono eseguiti una volta e che escono rapidamente, il tempo di avvio di Python può essere molto più lungo di quello di Bash. Ma se lo script contiene calcoli significativi, Python procede rapidamente.

  5. Python ha il sistema di pacchetti più completo del pianeta. Quando Bash diventa anche leggermente complesso, Python probabilmente ha un pacchetto che rende interi blocchi di Bash una singola chiamata. Tuttavia, trovare i pacchetti giusti da utilizzare è la parte più grande e scoraggiante del diventare un Pythonista. Fortunatamente, Google e StackExchange sono tuoi amici.


2

Non so se sia accurato, ma ho scoperto che python / ruby ​​funziona molto meglio per gli script che hanno molti calcoli matematici. Altrimenti devi usare dco qualche altro "calcolatore di precisione arbitraria". Diventa solo un grande dolore. Con python hai molto più controllo sui float rispetto agli int ed è molto più facile eseguire molti calcoli e talvolta.

In particolare, non lavorerei mai con uno script bash per gestire informazioni binarie o byte. Invece userei qualcosa come python (forse) o C ++ o anche Node.JS.


L'aritmetica di Bash è strettamente intera, quindi devi eseguire operazioni in virgola mobile chiamando qualcos'altro (come awk o dc) e catturando l'output da esso. Semplici operazioni monetarie possono spesso essere fatte internamente semplicemente moltiplicando per 100 e regolando il punto decimale nell'output.
DocSalvager

0

Dal punto di vista delle prestazioni, entrambi possono fare allo stesso modo, quindi la domanda diventa: chi fa risparmiare più tempo di sviluppo?

Bash si basa sulla chiamata di altri comandi e sul loro collegamento per crearne di nuovi. Questo ha il vantaggio di poter creare rapidamente nuovi programmi solo con il codice preso in prestito da altre persone, indipendentemente dal linguaggio di programmazione utilizzato.

Questo ha anche l'effetto collaterale di resistere abbastanza bene al cambiamento nei sottocomandi, poiché l'interfaccia tra loro è solo testo semplice.

Inoltre Bash è molto permissivo su come scrivere su di esso. Ciò significa che funzionerà bene per una più ampia varietà di contesti, ma si basa anche sul fatto che il programmatore abbia l'intenzione di codificare in modo pulito e sicuro. Altrimenti Bash non ti impedirà di creare un casino.

Python è più strutturato sullo stile, quindi un programmatore disordinato non sarà così disordinato. Funzionerà anche su sistemi operativi al di fuori di Linux, rendendolo immediatamente più appropriato se hai bisogno di quel tipo di portabilità.

Ma non è così semplice chiamare altri comandi. Quindi, se il tuo sistema operativo è Unix molto probabilmente scoprirai che lo sviluppo su Bash è il modo più veloce per sviluppare.

Quando usare Bash:

  • È un programma non grafico o il motore di uno grafico.
  • È solo per Unix.

Quando usare Python:

  • È un programma grafico.
  • Funzionerà su Windows.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.