Évidemment Python est plus convivial, une recherche rapide sur Google montre de nombreux résultats qui indiquent que, comme Python compilé en octets est généralement plus rapide. J'ai même trouvé this qui affirme que vous pouvez constater une amélioration de plus de 2000% des opérations basées sur les dictionnaires.
Quelle est votre expérience à ce sujet? Dans quel type de tâche chacun est-il clairement gagnant?
Flux typique de l’ordinateur central ...
Input Disk/Tape/User (runtime) --> Job Control Language (JCL) --> Output Disk/Tape/Screen/Printer
| ^
v |
`--> COBOL Program --------'
Flux Linux typique ...
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 Linux tels que sh/ksh/ bash /... fournissent des fonctions de désignation d’entrée/sortie/contrôle de flux très similaires à l’ancien langage de contrôle des tâches mainframe. mais sur les stéroïdes! Ils sont langues complètes de Turing à eux seuls, tout en étant optimisés pour transmettre efficacement les données et le contrôle vers et depuis les autres processus d'exécution écrits dans toutes les langues prises 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 Bash est devenu la plus courante. En cliquant sur une icône du bureau, vous exécutez généralement un court script Bash . Ce script, directement ou indirectement, sait où se trouvent tous les fichiers nécessaires et définit les variables et les paramètres de ligne de commande, appelant enfin le programme. C'est l'utilisation la plus simple d'un Shell.
Cependant, Linux tel que nous le connaissons ne serait sans doute pas 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, compilent, configurent et exécutent des programmes. Beaucoup d'entre eux sont assez grands et complexes.
Les shells fournissent une infrastructure qui nous permet d'utiliser des composants prédéfinis qui sont reliés entre eux au moment de l'exécution plutôt que lors de la compilation. Ces composants sont des programmes autonomes qui peuvent être utilisés seuls ou combinés sans recompilation. La syntaxe utilisée pour les appeler est identique à celle d’une commande intégrée Bash . Il existe en fait de nombreuses commandes intégrées pour lesquelles il existe également une commande autonome. exécutable sur le système, souvent avec des options supplémentaires.
Il n'y a pas de différence linguistique entre Python et Bash en termes de performances. Cela dépend entièrement de la manière dont chacun est codé et des outils externes appelés.
Any des outils bien connus tels que awk, sed, grep, bc, dc, tr, etc. partiront faire ces opérations dans les deux langues dans la poussière. Bash est préférable pour tout élément dépourvu d’interface utilisateur graphique, car il est plus facile et plus efficace d’appeler et de transmettre des données depuis un outil comme ceux avec Bash que Python .
Cela dépend des programmes appelés et des appels du script shell Bash , ainsi que de leur pertinence pour la sous-tâche à déterminer si le débit global et/ou la réactivité sera meilleur ou pire. que l'équivalent Python . Pour compliquer les choses Python , comme la plupart des langages, peut également appeler d'autres exécutables, bien qu'il soit plus encombrant et donc moins utilisé.
L'interface utilisateur est l'un des domaines où Python est le gagnant. Cela en fait un excellent langage pour la construction d'applications locales ou client-serveur car il supporte de manière native les graphiques GTK et est beaucoup plus intuitif que Bash .
Bash ne comprend que le texte. D'autres outils doivent être appelés pour une interface graphique et les données qui leur sont renvoyées. Un script Python est une option. Les options binaires telles que YAD, Zenity et GTKDialog sont plus rapides mais moins souples.
Alors que des shells tels que Bash fonctionnent bien avec des interfaces graphiques telles que Yad , GtkDialog (interface de type XML incorporée aux fonctions GTK + ) , dialogue , et xmessage , Python est généralement plus facile et plus performant.
Construire avec des scripts Shell, c'est comme assembler un ordinateur avec des composants standard, comme le sont les ordinateurs de bureau.
Construire avec Python , C++ ou la plupart des autres langages ressemble plus à la construction un ordinateur en soudant les puces (bibliothèques) et autres composants électroniques comme le sont les smartphones.
Généralement, bash fonctionne mieux que python uniquement dans les environnements où python n'est pas disponible. :)
Sérieusement, je dois m'occuper des deux langues tous les jours et je prendrai python instantanément sur bash si on me laisse le choix. Hélas, je suis obligé d'utiliser bash sur certaines "petites" plates-formes parce que quelqu'un a ( à tort, à mon humble avis) a décidé que python est "trop volumineux" pour tenir.
S'il est vrai que bash est peut-être plus rapide que python pour certaines tâches, il ne peut jamais être aussi rapide à développer, ni aussi facile à gérer (du moins après que vous ayez dépassé 10 lignes de Le seul point fort de Bash est python ou Ruby ou lua, etc.), c’est son omniprésence.
L'efficacité du développeur est beaucoup plus importante pour moi dans les scénarios où bash et Python sont des choix judicieux.
Certaines tâches se prêtent bien à l’abattage, d’autres à Python. De plus, il n’est pas inhabituel pour moi de commencer quelque chose en tant que script bash et de le changer en Python au fur et à mesure de son évolution sur plusieurs semaines.
Un gros avantage Python a dans les cas critiques la gestion des noms de fichiers, alors qu'il a glob , shutil , sous-processus =, et d’autres pour les besoins de script courants.
Lorsque vous écrivez des scripts, les performances importent peu (dans la plupart des cas).
Si vous vous souciez de la performance, "Python vs Bash" est une fausse question.
Python:
+ plus facile à écrire
+ plus facile à entretenir
+ réutilisation de code plus facile (essayez de trouver un moyen universel et sans erreur d'inclure des fichiers avec un code commun dans sh
, je vous mets au défi)
+ vous pouvez faire OOP avec aussi!
+ analyse plus facile des arguments. bien, pas plus facile, exactement. ce sera toujours trop verbeux à mon goût, mais python a la fonction argparse
intégrée.
- "sous-processus" moche et moche. essayez d'enchaîner les commandes et de ne pas pleurer une rivière à quel point votre code va devenir moche. surtout si vous vous souciez des codes de sortie.
Bash:
+ ubiquité, comme il a été dit plus tôt, en effet.
+ commandes simples chaînées. C'est ainsi que vous assemblez différentes commandes de manière simple. De plus, Bash
(et non pas sh
) a quelques améliorations, comme pipefail
, de sorte que l'enchaînement est vraiment court et expressif.
+ ne nécessite pas l'installation de programmes tiers. peut être exécuté tout de suite.
- mon dieu, c'est plein de trucs. IFS, CDPATH… des milliers d’entre eux.
Si vous écrivez un script de plus de 100 LOC: choisissez Python
Si un script nécessite une manipulation de chemin: choisissez Python (3)
Si vous avez besoin d'un peu comme alias
mais un peu compliqué: choisissez Bash/sh
Quoi qu’il en soit, il faut essayer des deux côtés pour se faire une idée de ce qu’ils sont capables de faire.
Peut-être que la réponse peut être étendue avec le packaging et IDE), mais je ne connais pas ce côté.
Comme toujours, vous devez choisir entre sandwich turd et douche géante. Et rappelez-vous, Perl était un nouvel espoir il y a quelques années à peine. Où il est maintenant.
En termes de performances, bash surpasse python au moment du démarrage du processus.
Voici quelques mesures de mon ordinateur portable principal 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 bibliothèques chargées en Python sont: os, os.path, json, heure, requêtes, threads, sous-processus
Cela montre une différence énorme, mais le temps d’exécution de bash se dégrade rapidement s’il doit faire quelque chose de sensé, car il doit généralement faire appel à des processus externes.
Si vous vous souciez de la performance, utilisez bash uniquement pour:
Bash est avant tout un langage de script batch/shell avec beaucoup moins de support pour divers types de données et toutes sortes de bizarreries autour des structures de contrôle - sans parler des problèmes de compatibilité.
Lequel est plus vite? Ni parce que vous ne comparez pas des pommes avec des pommes ici. Si vous deviez trier un fichier texte ASCII et que vous utilisiez des outils tels que zcat, sort, uniq et sed, vous fumeriez Python en termes de performances.
Toutefois, si vous avez besoin d’un environnement de programmation approprié prenant en charge les virgules flottantes et divers flux de contrôle, alors Python gagne haut la main. Si vous avez écrit un algorithme récursif dans Bash et Python, le paramètre Python version va gagner dans un ordre de grandeur ou plus.
Si vous cherchez à bricoler un utilitaire rapide avec un minimum d'effort, bash est bon. Bash est inestimable pour un wrapper autour d’une application.
Tout ce qui pourrait vous faire revenir encore et encore pour apporter des améliorations est probablement (bien que pas toujours) mieux adapté à un langage tel que Python car le code Bash comprenant plus de 1000 lignes devient très pénible à maintenir. Le code Bash est également irritant pour le débogage quand il devient long .......
D'après mon expérience, une partie du problème que pose ce type de question est que les scripts Shell sont généralement des tâches personnalisées. Il y a eu très peu de tâches de script Shell que j'ai rencontrées où une solution est déjà disponible gratuitement.
Il existe 2 scénarios où les performances de Bash sont au moins égales, je crois:
Cela dit, en général, je ne me préoccupe pas vraiment de l'exécution du langage de script lui-même. Si la performance est un problème réel, vous n’écrivez pas de script mais programme (éventuellement en Python).
Je ne sais pas si cela est exact, mais j'ai constaté que python/Ruby fonctionnait beaucoup mieux pour les scripts comportant de nombreux calculs mathématiques. Sinon, vous devez utiliser dc
ou un autre "calculateur de précision arbitraire". Cela devient juste une très grosse douleur. Avec python vous avez beaucoup plus de contrôle sur float vs ints et il est beaucoup plus facile d’effectuer beaucoup de calculs et parfois.
En particulier, je ne travaillerais jamais avec un script bash pour gérer des informations binaires ou des octets. J'utiliserais plutôt quelque chose comme python (peut-être), C++ ou même Node.JS.
Je poste cette réponse tardive principalement parce que Google aime cette question.
Je pense que le problème et le contexte devraient vraiment concerner le flux de travail, pas les outils. La philosophie générale est toujours "Utilisez le bon outil pour le travail". Mais auparavant, beaucoup oublient souvent de se perdre dans les outils: "Faites le travail".
Quand j'ai un problème qui n'est pas complètement défini, je commence presque toujours par Bash. J'ai résolu certains problèmes épineux dans de gros scripts Bash, lisibles et maintenables.
Mais quand le problème commence-t-il à dépasser ce que Bash devrait être invité à faire? J'ai quelques chèques que j'utilise pour me donner des avertissements:
La liste continue. En bout de ligne, lorsque vous travaillez plus fort pour garder vos scripts en marche que vous ajoutez des fonctionnalités, il est temps de quitter Bash.
Supposons que vous ayez décidé de déplacer votre travail vers Python. Si vos scripts Bash sont propres, la conversion initiale est assez simple. Il existe même plusieurs convertisseurs/traducteurs qui effectueront le premier passage pour vous.
La question suivante est la suivante: qu'abandonnez-vous en vous déplaçant vers Python?
Tous les appels aux utilitaires externes doivent être emballés dans quelque chose du module subprocess
(ou équivalent). Il y a plusieurs façons de le faire, et jusqu'à la version 3.7, il fallait quelques efforts pour bien faire les choses (3.7 amélioré subprocess.run()
pour gérer seul tous les cas courants).
Étonnamment, Python ne possède aucun utilitaire standard non bloquant indépendant de la plate-forme (avec timeout) pour interroger le clavier (stdin). La commande Bash read
est un outil génial pour les utilisateurs simples. Mon utilisation la plus courante est d’afficher un compteur jusqu’à ce que l’utilisateur appuie sur une touche tout en exécutant une fonction d’interrogation (à chaque étape du compteur) afin de s’assurer que tout fonctionne bien. C’est un problème plus complexe qu’il ne le serait au premier abord. , alors je fais souvent simplement un appel à Bash: Cher, mais c’est précisément ce dont j'ai besoin.
Si vous développez sur un système intégré ou soumis à des contraintes de mémoire, l'empreinte mémoire de Python peut être plusieurs fois supérieure à celle de Bash (selon la tâche à exécuter). De plus, il y a presque toujours une instance de Bash déjà en mémoire, ce qui peut ne pas être le cas pour Python.
Pour les scripts exécutés une fois et quittés rapidement, le temps de démarrage de Python peut être beaucoup plus long que celui de Bash. Mais si le script contient des calculs importants, Python avance rapidement.
Python possède le système de paquets le plus complet de la planète. Lorsque Bash devient même légèrement complexe, Python contient probablement un paquet qui fait que des parties entières de Bash deviennent un appel unique. Cependant, trouver le bon paquet à utiliser est la partie la plus lourde et la plus redoutable de devenir un pythoniste. Heureusement, Google et StackExchange sont vos amis.