Python vs Bash - Em que tipo de tarefas cada um supera o outro em termos de desempenho?

97

Obviamente Python é mais amigável, uma busca rápida no google mostra muitos resultados que dizem que, como Python é compilado por byte é geralmente mais rápido. Eu até descobri isso que afirma que você pode ver uma melhoria de mais de 2.000% nas operações baseadas em dicionário.

Qual é a sua experiência neste assunto? Em que tipo de tarefa cada um é um vencedor claro?

Sósia
fonte
6
Na verdade, isso não é uma enquete, não há opções predefinidas. Preciso de alguns insights sobre qual ferramenta faz o melhor tipo de trabalho.
Doppelganger

Respostas:

94

Fluxo de mainframe típico ...

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

Fluxo típico do 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                          |
                                   :                          :

Shells são a cola do Linux

Os shells do Linux, como sh / ksh / bash / ... fornecem recursos de designação de entrada / saída / controle de fluxo muito parecidos com o antigo mainframe Job Control Language ... mas com esteróides! Eles são linguagens Turing completas em seu próprio direito, enquanto são otimizados para passar dados e controle de forma eficiente de e para outros processos de execução escritos em qualquer linguagem que o O / S suporte.

A maioria dos aplicativos Linux, independentemente do idioma em que a maior parte do programa é escrito, depende de scripts de shell e o Bash se tornou o mais comum. Clicar em um ícone na área de trabalho geralmente executa um pequeno script Bash . Esse script, direta ou indiretamente, sabe onde estão todos os arquivos necessários e define variáveis ​​e parâmetros de linha de comando, finalmente chamando o programa. Esse é o uso mais simples de um shell.

O Linux como o conhecemos, entretanto, dificilmente seria Linux sem os milhares de scripts de shell que inicializam o sistema, respondem a eventos, controlam as prioridades de execução e compilam, configuram e executam programas. Muitos deles são bastante grandes e complexos.

Os shells fornecem uma infraestrutura que nos permite usar componentes pré-construídos que são vinculados em tempo de execução em vez de tempo de compilação. Esses componentes são programas independentes que podem ser usados ​​sozinhos ou em outras combinações sem recompilar. A sintaxe para chamá-los é indistinguível de um comando embutido do Bash e, de fato, existem vários comandos embutidos para os quais também existe um executável autônomo no sistema, geralmente com opções adicionais.

Não há diferença de desempenho em toda a linguagem entre Python e Bash . Depende inteiramente de como cada um é codificado e quais ferramentas externas são chamadas.

Qualquer uma das ferramentas mais conhecidas como awk, sed, grep, bc, dc, tr, etc. deixará de fazer essas operações em qualquer idioma no pó. O Bash é preferível para qualquer coisa sem uma interface gráfica do usuário, pois é mais fácil e mais eficiente chamar e passar dados de volta de uma ferramenta como as do Bash do que do Python .

atuação

Depende de quais programas o script de shell Bash chama e de sua adequação para a subtarefa que recebem, se o rendimento geral e / ou a capacidade de resposta será melhor ou pior do que o Python equivalente . Para complicar as coisas , o Python , como a maioria das linguagens, também pode chamar outros executáveis, embora seja mais complicado e, portanto, não é usado com tanta frequência.

Interface de usuário

Uma área em que o Python é o vencedor claro é a interface do usuário. Isso a torna uma linguagem excelente para a construção de aplicativos locais ou cliente-servidor, já que oferece suporte nativo a gráficos GTK e é muito mais intuitiva que o Bash .

O Bash só entende texto. Outras ferramentas devem ser chamadas para uma GUI e os dados devolvidos a partir delas. Um script Python é uma opção. Opções mais rápidas, mas menos flexíveis, são os binários como YAD, Zenity e GTKDialog .

Enquanto shells como o Bash funcionam bem com GUIs como Yad , GtkDialog (interface semelhante a XML incorporada para funções GTK +) , dialog e xmessage , Python é muito mais capaz e, portanto, melhor para janelas GUI complexas.

Resumo

Construir com scripts de shell é como montar um computador com componentes prontos para uso, da mesma forma que os desktops.

Construir com Python , C ++ ou qualquer outra linguagem é mais como construir um computador soldando os chips (bibliotecas) e outras partes eletrônicas, como os smartphones.

Os melhores resultados são geralmente obtidos usando uma combinação de linguagens onde cada uma pode fazer o que faz melhor. Um desenvolvedor chama isso de " programação poliglota ".

DocSalvager
fonte
16
Não estou reconhecendo como pode ser uma resposta aceita. Ele não fornece nenhuma ideia sobre para quais tarefas esses dois são mais adequados.
vigilancer
2
@vigilancer Espero que as modificações e adições que acabamos de postar sejam úteis.
DocSalvager
1
Embora eu concorde com outros comentários, isso não responde exatamente à pergunta. Esta é uma das melhores respostas que já li!
Jim Mitchener
72

Geralmente, o bash funciona melhor que o python apenas em ambientes onde o python não está disponível. :)

Sério, eu tenho que lidar com as duas linguagens diariamente, e irei usar o python instantaneamente em vez do bash se puder. Infelizmente, sou forçado a usar o bash em certas plataformas "pequenas" porque alguém (por engano, IMHO) decidiu que o python é "muito grande" para caber.

Embora seja verdade que o bash pode ser mais rápido do que o python para algumas tarefas selecionadas, ele nunca pode ser tão rápido de desenvolver, ou tão fácil de manter (pelo menos depois de passar de 10 linhas de código ou mais). O único ponto forte do Bash em relação a python, ruby ​​ou lua, etc., é sua onipresença.

Kevin Little
fonte
4
O Python já não está em todos os Linux / Unix, até mesmo no MacOS? Estou curioso para saber quais operações são mais rápidas no bash - pelo que entendi, chamar diferentes comandos separados o torna muito mais lento do que os comandos de módulo osou do Python shutil.
NoBugs de
1
@NoBugs Definitivamente não estaria em todas as distribuições Linux / Unix. É quase certo que vem em todas as principais distribuições do Linux (por exemplo, distribuições baseadas em debian, slackware, etc.) e Mac OS X, no entanto, se você construir sua própria iso com yocto ( yoctoproject.org ), então você não poderia tê-la, pois você mesmo personaliza cada pacote. Mas provavelmente é seguro dizer que para qualquer grande sistema operacional Unix hoje em dia, ele virá instalado com o python2 (pelo menos) e talvez o python3 também.
dylnmc
Python é uma excelente linguagem de script para tarefas complexas, como uma GUI completa. Tão importante quanto, ele impõe boas práticas de programação para que os programas sejam mais fáceis de manter. O Bash requer a imposição de boas práticas aprendidas em outro lugar para ser sustentável. Ao fazer isso, e usando um utilitário de diálogo GUI ou Python for UI, oferece desempenho superior (por meio de programas utilitários extremamente rápidos chamados do Bash), bem como uma boa UX.
DocSalvager
34

A eficiência do desenvolvedor é muito mais importante para mim em cenários onde bash e Python são escolhas sensatas.

Algumas tarefas se prestam bem ao bash e outras ao Python. Também não é incomum eu iniciar algo como um script bash e alterá-lo para Python conforme ele evolui ao longo de várias semanas.

Uma grande vantagem do Python é em casos de canto em torno de manipulação de nome de arquivo, enquanto tem glob , shutil , subprocess e outros para necessidades de script comuns.

Roger Pate
fonte
5
A questão visava a comparação "inteligente", o que implica o desempenho da máquina e não o desempenho do desenvolvedor. Veja meus testes de desempenho em outra resposta.
Grzegorz Luczywo
25

Ao escrever scripts, o desempenho não importa (na maioria dos casos).
Se você se preocupa com o desempenho, 'Python vs Bash' é uma questão falsa.

Pitão :
+ mais fácil de escrever
+ mais fácil de manter
+ mais fácil de reutilizar código (tente encontrar uma maneira universal à prova de erros de incluir arquivos com código comum sh, ouso)
+ você também pode fazer OOP com ele!
+ análise de argumentos mais fácil. bem, não é mais fácil, exatamente. ainda será muito prolixo para o meu gosto, mas python tem um argparserecurso embutido.
- 'subprocesso' feio e feio. tente encadear comandos e não chorar o quão feio seu código se tornará. especialmente se você se preocupa com os códigos de saída.

Bash :
+ onipresença, como foi dito antes, de fato.
+ encadeamento de comandos simples. é assim que você cola diferentes comandos de uma maneira simples. Também Bash(não sh) tem algumas melhorias, como pipefail, então, o encadeamento é muito curto e expressivo.
+ não requer a instalação de programas de terceiros. pode ser executado imediatamente.
- Deus, está cheio de pegadinhas. IFS, CDPATH .. milhares deles.

Se alguém estiver escrevendo um script maior que 100 LOC: escolha Python
Se alguém precisar de manipulação de caminho no script: escolha Python (3)
Se alguém precisar de algo parecido, aliasmas um pouco complicado: escolha Bash / sh

De qualquer forma, deve-se tentar os dois lados para ter uma ideia do que eles são capazes.

Talvez a resposta possa ser estendida com empacotamento e pontos de suporte IDE, mas não estou familiarizado com esses lados.

Como sempre, você deve escolher entre sanduíche de cocô e douche gigante. E lembre-se, apenas alguns anos atrás, Perl era uma nova esperança. Onde está agora.

vigilante
fonte
4
Sim, um código com bash vive para sempre. Eu codifiquei muito Perl, eles são inúteis agora.
Raymond gsh
Só para ter uma perspectiva ... O maior script que escrevi atualmente, que uso o dia todo, todos os dias, pesa 4121 linhas de código bash real, sem comentários ou de linha em branco. Com os comentários extensos e tal, chega a 7261 linhas. Ele é acompanhado por um arquivo de ajuda de documentos semelhantes a páginas de manual para cada função que tenha outras 6650 linhas. Cada função tem uma opção que pode recuperar e exibir instantaneamente seu texto de ajuda na melhor forma de saída disponível que atualmente inclui 3 versões de YAD, Zenity, diálogo ou apenas texto CLI simples. Eu chamo de 'kit'. está na versão 44 no momento desta escrita.
DocSalvager de
Isso é pesado! (c)
vigilante
1
Não acho que LoC seja realmente o fator de decisão para escolher Python. Mais, quão complexa é a tarefa que você está realizando? Se você está apenas encadeando 100 comandos, provavelmente tudo bem, se for apenas 30 LoC no bash, mas poderia ser mais fácil de entender em Python - use python.
JFord
@Akito está tudo bem, quando nada toca nele. mas existem algumas situações em que as coisas podem dar errado. você o definiu como não padrão e se esqueceu de limpá-lo. algo externo mudou, mas seu script depende do padrão e assim por diante. é preciso sempre manter o IFS em mente, porque algumas ferramentas o utilizam implicitamente.
vigilante
22

O bash em termos de desempenho supera o python no tempo de inicialização do processo.

Aqui estão algumas medições do meu laptop Core i7 executando o 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

* As bibliotecas carregadas do Python são: os, os.path, json, time, requests, threading, subprocess

Isso mostra uma grande diferença, entretanto o tempo de execução do bash se degrada rapidamente se ele tiver que fazer algo sensato, pois geralmente deve chamar processos externos.

Se você se preocupa com o desempenho, use o bash apenas para:

  • scripts realmente simples e frequentemente chamados
  • scripts que principalmente chamam outros processos
  • quando você precisar de um atrito mínimo entre as ações administrativas manuais e os scripts - verifique rapidamente alguns comandos e coloque-os no arquivo.sh
Grzegorz Luczywo
fonte
... e /bin/echosupera o bash em tal magnitude, é difícil de medir. Portanto, em vez de executar o bash, você pode usar /bin/echo mycommand > named_pipe(comandos / mensagens de saída para um pipe ou socket nomeado) ... e ter um processo Python de segundo plano lendo comandos / instruções daquele pipe e executando-os. Portanto, o bash não é realmente uma boa "otimização de custos de inicialização".
Cezary Baginski
Normalmente, você deve usar threads em vez de processos quando a tarefa é realmente curta e rápida. Múltiplos processos são uma coisa de alto nível e, desde que inicie um dentro de meio segundo, isso parece bastante razoável na maior parte, você não diria?
Timothy Swan,
16

Bash é principalmente uma linguagem de script batch / shell com muito menos suporte para vários tipos de dados e todos os tipos de peculiaridades em torno de estruturas de controle - para não mencionar problemas de compatibilidade.

O que é mais rápido? Nem, porque você não está comparando maçãs com maçãs aqui. Se você tivesse que classificar um arquivo de texto ascii e estivesse usando ferramentas como zcat, sort, uniq e sed, então você abandonaria o Python em termos de desempenho.

No entanto, se você precisa de um ambiente de programação adequado que suporte ponto flutuante e vários fluxos de controle, então o Python vence. Se você escreveu, digamos, um algoritmo recursivo em Bash e Python, a versão Python vencerá em uma ordem de magnitude ou mais.

Justin
fonte
13
Portanto, toda a moral do meu discurso é: use a ferramenta certa para o trabalho certo.
Justin
2
o ponto flutuante é compatível com ferramentas como awk, bc e com shells como zsh / ksh, então por que você diz que o Python vence?
ghostdog74
4
Porque essas ferramentas não são Bash. Eu estava apontando uma diferença distinta. Essas ferramentas são usadas em um script de shell, mas o próprio Bash nativo não oferece suporte a ponto flutuante.
Justin
2
Não. Experimente você mesmo. Faça gzip de um arquivo de log grande e use zcat, sort, etc. para fazer alguma filtragem e, em seguida, use as bibliotecas nativas do Python. É significativamente mais rápido usando as ferramentas nativas.
Justin
6
@justin, sim, essas ferramentas não são Bash, mas existem desde os tempos antigos e são frequentemente usadas em scripts de shell. se você quiser ponto flutuante, use awk / bc. É uma combinação dessas ferramentas que tornam o script de shell tão poderoso quanto o Python.
ghostdog74
12

Se você está procurando montar um utilitário rápido com o mínimo de esforço, o bash é bom. Para um wrapper em torno de um aplicativo, o bash é inestimável.

Qualquer coisa que possa fazer você voltar várias vezes para adicionar melhorias é provavelmente (embora nem sempre) mais adequado para uma linguagem como Python, já que o código Bash com mais de 1000 linhas é muito difícil de manter. O código Bash também é irritante para depurar quando fica longo .......

Parte do problema com esse tipo de pergunta é, pela minha experiência, que os scripts de shell geralmente são tarefas personalizadas. Eu encontrei muito poucas tarefas de script de shell em que já houvesse uma solução disponível gratuitamente.

Zamhassam
fonte
8

Existem 2 cenários em que o desempenho do Bash é pelo menos igual, acredito:

  • Script de utilitários de linha de comando
  • Scripts que demoram pouco tempo para serem executados; onde iniciar o interpretador Python leva mais tempo do que a própria operação

Dito isso, normalmente não me preocupo muito com o desempenho da linguagem de script em si. Se o desempenho é um problema real, você não faz script, mas programa (possivelmente em Python).

extrânon
fonte
4

Estou postando esta resposta tardia principalmente porque o Google gosta dessa pergunta.

Acredito que o problema e o contexto realmente devem ser sobre o fluxo de trabalho, não as ferramentas. A filosofia geral é sempre "Use a ferramenta certa para o trabalho." Mas antes disso vem um que muitos esquecem quando se perdem nas ferramentas: "Faça o trabalho".

Quando tenho um problema que não está completamente definido, quase sempre começo com o Bash. Resolvi alguns problemas complicados em grandes scripts Bash que podem ser lidos e mantidos.

Mas quando o problema começa a exceder o que o Bash deveria fazer? Tenho alguns cheques que uso para me avisar:

  1. Estou desejando que o Bash tenha matrizes 2D (ou superior)? Se sim, é hora de perceber que Bash não é uma ótima linguagem de processamento de dados.
  2. Estou fazendo mais trabalho preparando dados para outros utilitários do que realmente executando esses utilitários? Se sim, é hora de perceber que o Bash não é uma ótima linguagem de processamento de dados.
  3. Meu script está simplesmente ficando grande demais para ser gerenciado? Se sim, é importante perceber que, embora o Bash possa importar bibliotecas de script, ele carece de um sistema de pacotes como outras linguagens. É realmente uma linguagem "role sua própria" em comparação com a maioria das outras. Por outro lado, ele tem uma enorme quantidade de funcionalidades embutidas (alguns dizem demais ...)

A lista continua. Resumindo, quando você está trabalhando mais para manter seus scripts em execução ao adicionar recursos, é hora de deixar o Bash.

Vamos supor que você decidiu mover seu trabalho para Python. Se seus scripts Bash estiverem limpos, a conversão inicial é bastante direta. Existem até vários conversores / tradutores que farão a primeira passagem para você.

A próxima pergunta é: Do que você desiste de mudar para Python?

  1. Todas as chamadas para utilitários externos devem ser agrupadas em algo do subprocessmódulo (ou equivalente). Existem várias maneiras de fazer isso, e até o 3.7 era necessário algum esforço para acertar (o 3.7 melhorou subprocess.run()para lidar com todos os casos comuns por conta própria).

  2. Surpreendentemente, o Python não tem um utilitário sem bloqueio independente de plataforma padrão (com tempo limite) para consultar o teclado (stdin). O readcomando Bash é uma ferramenta incrível para interação simples do usuário. Meu uso mais comum é mostrar um botão giratório até que o usuário pressione uma tecla, enquanto também executa uma função de votação (a cada etapa do botão giratório) para garantir que as coisas ainda estejam funcionando bem. Este é um problema mais difícil do que poderia parecer à primeira vista, então muitas vezes eu simplesmente faço uma ligação para Bash: caro, mas faz exatamente o que preciso.

  3. Se você estiver desenvolvendo em um sistema integrado ou com restrição de memória, a área de cobertura da memória do Python pode ser muitas vezes maior do que a do Bash (dependendo da tarefa em mãos). Além disso, quase sempre há uma instância do Bash já na memória, o que pode não ser o caso do Python.

  4. Para scripts que são executados uma vez e saem rapidamente, o tempo de inicialização do Python pode ser muito mais longo do que o do Bash. Mas se o script contém cálculos significativos, o Python sai rapidamente à frente.

  5. Python tem o sistema de pacotes mais completo do planeta. Quando o Bash fica ainda mais complexo, Python provavelmente tem um pacote que faz com que pedaços inteiros do Bash se tornem uma única chamada. No entanto, encontrar o (s) pacote (s) certo (s) para usar é a maior e mais assustadora parte de se tornar um Pythonista. Felizmente, o Google e o StackExchange são seus amigos.

BobC
fonte
2

Não sei se isso é preciso, mas descobri que python / ruby ​​funciona muito melhor para scripts que têm muitos cálculos matemáticos. Caso contrário, você tem que usardc ou alguma outra "calculadora de precisão arbitrária". Simplesmente se torna uma grande dor. Com o python, você tem muito mais controle sobre floats do que ints e é muito mais fácil realizar muitos cálculos e às vezes.

Em particular, eu nunca trabalharia com um script bash para lidar com informações binárias ou bytes. Em vez disso, usaria algo como python (talvez) ou C ++ ou mesmo Node.JS.

dylnmc
fonte
A aritmética Bash é estritamente inteira, então você precisa fazer operações de ponto flutuante chamando outra coisa (como awk ou dc) e capturando a saída dela. Muitas vezes, coisas monetárias simples podem ser feitas internamente, simplesmente multiplicando por 100 e ajustando a vírgula decimal na saída.
DocSalvager
0

Em termos de desempenho, ambos podem fazer da mesma forma, então a questão é: qual economiza mais tempo de desenvolvimento?

O Bash depende da chamada de outros comandos e canalizá-los para a criação de novos. A vantagem disso é que você pode criar novos programas rapidamente apenas com o código emprestado de outras pessoas, independentemente da linguagem de programação usada.

Isso também tem o efeito colateral de resistir muito bem às mudanças nos subcomandos, já que a interface entre eles é apenas texto simples.

Além disso, o Bash é muito permissivo sobre como você pode escrever nele. Isso significa que funcionará bem para uma ampla variedade de contextos, mas também depende do programador ter a intenção de codificar de maneira limpa e segura. Caso contrário, o Bash não o impedirá de construir uma bagunça.

Python é mais estruturado em estilo, então um programador bagunçado não será tão bagunçado. Ele também funcionará em sistemas operacionais fora do Linux, tornando-o instantaneamente mais apropriado se você precisar desse tipo de portabilidade.

Mas não é tão simples chamar outros comandos. Portanto, se o seu sistema operacional for Unix, provavelmente você descobrirá que desenvolver no Bash é a maneira mais rápida de desenvolver.

Quando usar o Bash:

  • É um programa não gráfico ou o motor de um gráfico.
  • É apenas para Unix.

Quando usar Python:

  • É um programa gráfico.
  • Deve funcionar no Windows.
Alberto Salvia Novella
fonte