116 votes

Python vs Bash - Dans quel type de tâches l'un surpasse-t-il l'autre en termes de performances ?

Il est évident que Python est plus facile à utiliser, une recherche rapide sur Google montre de nombreux résultats qui disent que, comme Python est compilé par octet, il est généralement plus rapide. J'ai même trouvé ce qui prétend que vous pouvez constater une amélioration de plus de 2000% sur les opérations basées sur les dictionnaires.

Quelle est votre expérience en la matière ? Dans quel type de tâche chacun d'entre eux est clairement gagnant ?

2 votes

Python est drastiquement plus rapide sur le traitement de texte, qui est une opération courante. Si j'effectue la même recherche 10000 fois sur chaque langue, sur Bash il faut 1m24s, sur Python 636ms. Cela s'explique par le fait que Bash utilise un sous-processus pour chaque opération du traitement de texte, ce qui est lent à créer.

108voto

DocSalvage Points 334

Le flux typique d'un ordinateur central...

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

Flux typique de 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                          |
                                   :                          :

Les shells sont la colle de Linux

Les shells Linux comme sh/ksh/ bash /... fournissent des fonctions de désignation d'entrée/sortie/contrôle de flux, un peu comme le vieux langage de contrôle des travaux de l'ordinateur central... mais sous stéroïdes ! Ils sont Langages complets de Turing en tant que tels, tout en étant optimisés pour transmettre efficacement les données et le contrôle vers et depuis d'autres processus d'exécution écrits dans n'importe quel langage pris en charge par le système d'exploitation.

La plupart des applications Linux, quelle que soit la langue dans laquelle la majeure partie du programme est écrite, dépendent des scripts shell et des éléments suivants Bash est devenu le plus courant. En cliquant sur une icône sur le bureau, on exécute généralement un court Bash script. Ce script, directement ou indirectement, sait où se trouvent tous les fichiers nécessaires et définit les variables et les paramètres de la ligne de commande, pour finalement appeler le programme. C'est l'utilisation la plus simple d'un shell.

Cependant, Linux tel que nous le connaissons ne serait guère Linux sans les milliers de scripts shell qui démarrent le système, répondent aux événements, contrôlent les priorités d'exécution et compilent, configurent et exécutent les programmes. Beaucoup d'entre eux sont assez grands et complexes.

Les shells fournissent une infrastructure qui nous permet d'utiliser des composants préconstruits qui sont liés entre eux au moment de l'exécution plutôt qu'au moment de la compilation. Ces composants sont des programmes autonomes à part entière qui peuvent être utilisés seuls ou dans d'autres combinaisons sans recompilation. La syntaxe pour les appeler est indiscernable de celle d'un programme de type Bash et il existe en fait de nombreuses commandes intégrées pour lesquelles il existe également un exécutable autonome sur le système, avec souvent des options supplémentaires.

Il n'y a pas de différence linguistique entre Python y Bash en termes de performances. Cela dépend entièrement de la façon dont chacun est codé et des outils externes appelés.

Tout des outils bien connus comme awk, sed, grep, bc, dc, tr, etc. laisseront sur le carreau la réalisation de ces opérations dans l'une ou l'autre langue. Bash est préférable pour tout ce qui n'est pas une interface utilisateur graphique, car il est plus facile et plus efficace d'appeler et de renvoyer des données à partir d'un outil comme ceux qui utilisent la fonction Bash que Python .

Performance

Cela dépend des programmes que l Bash les appels au shell script et leur adéquation à la sous-tâche qui leur est donnée si le débit global et/ou la réactivité seront meilleurs ou pires que l'équivalent. Python . Pour compliquer les choses Python comme la plupart des langages, peut également appeler d'autres exécutables, bien que cette méthode soit plus lourde et donc moins utilisée.

Interface utilisateur

Un domaine dans lequel Python est le grand gagnant en matière d'interface utilisateur. Cela en fait un excellent langage pour la création d'applications locales ou client-serveur, car il prend en charge de manière native les graphiques GTK et est bien plus intuitif que le langage Bash .

Bash ne comprend que le texte. Il faut appeler d'autres outils pour obtenir une interface graphique et leur renvoyer des données. A Python script est une option. Des options plus rapides mais moins flexibles sont les binaires comme YAD, Zenity et GTKDialog .

Alors que les coquillages comme Bash fonctionnent bien avec des interfaces graphiques comme Yad , GtkDialog (interface intégrée de type XML aux fonctions de GTK+) , dialogue y xmessage , Python est beaucoup plus performant et donc meilleur pour les fenêtres à interface graphique complexe.

Résumé

Construire avec des scripts shell, c'est comme assembler un ordinateur avec des composants du commerce, comme on le fait pour les PC de bureau.

Construire avec Python , C++ ou la plupart des autres langages, c'est plus comme construire un ordinateur en soudant les puces (bibliothèques) et autres pièces électroniques ensemble, comme le font les smartphones.

Les meilleurs résultats sont généralement obtenus en utilisant une combinaison de langues où chacun peut faire ce qu'il fait de mieux. Un développeur appelle cela " programmation polyglotte ".

43 votes

Je ne parviens pas à comprendre comment cette réponse peut être acceptée. Elle ne donne aucune indication sur les tâches pour lesquelles ces deux-là sont plus adaptés.

2 votes

@vigilancer J'espère que les modifications et ajouts qui viennent d'être postés sont utiles.

2 votes

Bien que je sois d'accord avec les autres commentaires, cela ne répond pas exactement à la question. C'est l'une des meilleures réponses que j'aie jamais lues !

82voto

Kevin Little Points 5406

En général, bash fonctionne mieux que python uniquement dans les environnements où python n'est pas disponible. :)

Sérieusement, j'ai à faire avec les deux langages quotidiennement, et je choisirais instantanément python plutôt que bash si on me donnait le choix. Hélas, je suis obligé d'utiliser bash sur certaines "petites" plateformes parce que quelqu'un a (à tort, IMHO) décidé que python est "trop grand" pour s'y adapter.

S'il est vrai que bash peut être plus rapide que python pour certaines tâches, il ne pourra jamais être aussi rapide à développer ou aussi facile à maintenir (du moins après avoir dépassé les 10 lignes de code). Le seul point fort de Bash par rapport à python, ruby ou lua, etc. est son ubiquité.

5 votes

Python n'est-il pas déjà présent sur tous les Linux/Unix, même sur MacOS ? Je suis curieux de savoir quelles opérations sont plus rapides dans bash - d'après ce que j'ai compris, l'appel à différentes commandes séparées le rend beaucoup plus lent que Python. os o shutil les commandes du module.

2 votes

@NoBugs Il ne serait certainement pas sur toutes les distributions Linux/Unix. Il est presque certain qu'il est présent sur toutes les grandes distributions linux (par exemple les distributions basées sur debian, slackware, etc.) et Mac OS X, cependant, si vous construisez votre propre iso avec yocto ( yoctoproject.org ), alors vous ne pourriez pas l'avoir, car vous personnalisez vous-même chaque paquet. Mais on peut dire sans risque de se tromper que tout système d'exploitation Unix majeur est aujourd'hui installé avec python2 (au moins) et peut-être aussi avec python3.

0 votes

Python est un excellent langage de script pour les tâches complexes telles qu'une interface graphique complète. Tout aussi important, il impose de bonnes pratiques de programmation afin que les programmes soient plus faciles à maintenir. Bash nécessite l'imposition de bonnes pratiques apprises ailleurs afin d'être maintenable. Ce faisant, et en utilisant un utilitaire de dialogue GUI ou Python pour l'interface utilisateur, on obtient des performances supérieures (via des programmes utilitaires extrêmement rapides appelés depuis Bash) ainsi qu'une bonne interface utilisateur.

38voto

Efficacité des développeurs compte beaucoup plus pour moi dans les scénarios où bash et Python sont tous deux des choix judicieux.

Certaines tâches se prêtent bien à bash, d'autres à Python. Il n'est pas rare non plus que je commence quelque chose en tant que bash script et que je le change en Python au fur et à mesure de son évolution sur plusieurs semaines.

L'un des grands avantages de Python réside dans les cas particuliers de gestion des noms de fichiers. globe terrestre , shutil , sous-processus et d'autres pour les besoins courants en matière de script.

7 votes

La question visait à comparer les "performances", ce qui implique les performances de la machine et non celles du développeur. Voir mes tests de performance dans une autre réponse.

34voto

vigilancer Points 1286

Lorsque vous écrivez des scripts, la performance n'a pas d'importance (dans la plupart des cas).
Si vous vous intéressez aux performances, la question "Python vs Bash" est fausse.

Python :
+ plus facile à écrire
+ plus facile à entretenir
+ Réutilisation plus facile du code (essayez de trouver un moyen universel et sans erreur d'inclure des fichiers contenant du code commun dans le système de gestion de l'information) sh Je vous mets au défi)
+ vous pouvez faire du OOP avec lui aussi !
+ analyse plus facile des arguments. enfin, pas plus facile, exactement. il sera toujours trop verbeux à mon goût, mais python a argparse installation intégrée.
- essayez d'enchaîner les commandes et de ne pas pleurer comme une rivière sur la laideur de votre code. surtout si vous vous souciez des codes de sortie.

Bash :
+ l'ubiquité, comme il a été dit plus tôt, en effet.
+ enchaînement de commandes simples. C'est ainsi que l'on colle ensemble différentes commandes de manière simple. Aussi Bash (pas sh ) ont été améliorés, notamment pipefail Le chaînage est donc très court et expressif.
+ ne nécessitent pas l'installation de programmes tiers. peuvent être exécutés immédiatement.
- Mon dieu, c'est plein de pièges. IFS, CDPATH des milliers d'entre eux.

Si on écrit un script plus grand que 100 LOC : choisissez Python
Si on a besoin de manipuler des chemins dans script : choisir Python(3)
Si on a besoin de quelque chose comme alias mais légèrement compliqué : choisissez Bash/sh

Quoi qu'il en soit, il faut essayer les deux côtés pour se faire une idée de ce dont ils sont capables.

Peut-être que la réponse peut être étendue avec les points de support de l'emballage et de l'IDE, mais je ne suis pas familier avec ces côtés.

Comme toujours, vous devez choisir entre le sandwich à la merde et la douche géante. Et rappelez-vous, il y a quelques années, Perl était le nouvel espoir. Où il est maintenant.

7 votes

Oui, un code avec bash vit pour toujours. J'ai codé beaucoup de Perl, ils sont inutiles maintenant.

0 votes

Juste pour la perspective... Le plus grand script que j'ai écrit, que j'utilise toute la journée, tous les jours, pèse 4121 lignes de code bash réel, sans commentaire ni ligne vierge. Avec les nombreux commentaires et autres, cela fait 7261 lignes. Il est accompagné d'un fichier d'aide de type page de manuel pour chaque fonction, soit 6650 lignes supplémentaires. Chaque fonction a une option qui peut instantanément récupérer et afficher son texte d'aide dans la meilleure forme de sortie disponible qui comprend actuellement 3 versions de YAD, Zenity, dialog ou simplement du texte CLI. Je l'appelle 'kit'. Il en est à la version 44 au moment où j'écris ces lignes.

0 votes

C'est lourd ! (c)

33voto

Grzegorz Luczywo Points 579

En termes de performances, bash surpasse python en ce qui concerne le temps de démarrage du processus.

Voici quelques mesures effectuées sur mon ordinateur portable Core i7 sous 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

*Les librairies Python chargées sont : os, os.path, json, time, requests, threading, subprocess.

Cela montre une énorme différence, mais le temps d'exécution de Bash se dégrade rapidement s'il doit faire quelque chose de sensible, car il doit généralement appeler des processus externes.

Si vous vous souciez des performances, utilisez bash uniquement pour :

  • des scripts très simples et fréquemment appelés
  • des scripts qui appellent principalement d'autres processus
  • lorsque vous avez besoin d'une friction minimale entre les actions administratives manuelles et les scripts - vérifiez rapidement quelques commandes et placez-les dans le fichier .sh

2 votes

... et /bin/echo surpasse bash d'une telle ampleur qu'il est difficile de le mesurer. Ainsi, au lieu d'exécuter bash, vous pouvez utiliser /bin/echo mycommand > named_pipe (envoyer des commandes/messages vers un tuyau ou un socket nommé) ... et avoir un processus Python en arrière-plan qui lit les commandes/instructions de ce tuyau et les exécute. Ainsi, bash n'est pas vraiment une bonne "optimisation des coûts de démarrage".

1 votes

En général, vous êtes censé utiliser des threads au lieu de processus lorsque la tâche est vraiment courte et rapide. Les processus multiples sont une chose de haut niveau et tant que le démarrage d'un processus se fait en une demi-seconde, cela semble assez raisonnable pour la plupart, n'est-ce pas ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X