明らかにPythonの方がユーザーフレンドリーです。Googleでクイック検索を行うと多くの結果が表示されます。これは、Pythonがバイトコンパイルされるため、通常は高速であることを示しています。私も見つけ、これは、あなたが辞書ベースの操作で2000%以上の改善を見ることができると主張しています。
この問題についてあなたの経験は何ですか?それぞれが明確な勝者となるタスクの種類はどれですか。
明らかにPythonの方がユーザーフレンドリーです。Googleでクイック検索を行うと多くの結果が表示されます。これは、Pythonがバイトコンパイルされるため、通常は高速であることを示しています。私も見つけ、これは、あなたが辞書ベースの操作で2000%以上の改善を見ることができると主張しています。
この問題についてあなたの経験は何ですか?それぞれが明確な勝者となるタスクの種類はどれですか。
回答:
一般的なメインフレームフロー...
Input Disk/Tape/User (runtime) --> Job Control Language (JCL) --> Output Disk/Tape/Screen/Printer
| ^
v |
`--> COBOL Program --------'
一般的な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 |
: :
sh / ksh / bash / ...のようなLinuxシェルは、古いメインフレームジョブ制御言語とよく似た入力/出力/フロー制御指定機能を提供しますが、ステロイドです!それらは、O / Sがサポートする任意の言語で記述された他の実行プロセスとの間で効率的にデータを渡し、制御するように最適化されながら、それ自体で完全な言語をチューリングしています。
ほとんどのLinuxアプリケーションは、プログラムの大部分がどの言語で記述されているかに関係なく、シェルスクリプトに依存しており、Bashが最も一般的になっています。デスクトップ上のアイコンをクリックすると、通常、短いBashスクリプトが実行されます。そのスクリプトは、直接的または間接的に、必要なすべてのファイルの場所を認識し、変数とコマンドラインパラメーターを設定して、最終的にプログラムを呼び出します。これがシェルの最も簡単な使い方です。
しかし、私たちが知っているLinuxは、システムを起動し、イベントに応答し、実行優先順位を制御し、プログラムをコンパイル、構成、実行する何千ものシェルスクリプトなしでは、Linuxにはなりません。これらの多くは非常に大きく複雑です。
シェルは、コンパイル時ではなく実行時に一緒にリンクされているビルド済みコンポーネントを使用できるインフラストラクチャを提供します。これらのコンポーネントは、単独で、または再コンパイルせずに他の組み合わせで使用できる、独立したプログラムです。それらを呼び出すための構文は、Bash組み込みコマンドの構文と区別できません。実際、システムにはスタンドアロンの実行可能ファイルがあり、多くの場合、追加のオプションがある組み込みコマンドが多数あります。
PythonとBashのパフォーマンスには言語全体の違いはありません。それは完全にそれぞれがどのようにコード化されているか、そしてどの外部ツールが呼び出されるかに依存します。
いずれのようなよく知られているツールのAWK、sedは、grepを、BC、DC、TR、などは、ダスト中のいずれかの言語でこれらの操作をして残します。PythonよりもBashのようなツールからデータを呼び出して渡す方が簡単で効率的であるため、グラフィカルユーザーインターフェイスがないものにはBashが適しています。
全体のスループットや応答性が同等のPythonよりも良いか悪いかは、Bashシェルスクリプトが呼び出すプログラムとサブプログラムへの適合性に依存します。問題を複雑にするために、Pythonは、他の実行可能ファイルと同様に、他の実行可能ファイルを呼び出すこともできます。
一つのエリアPythonは明確な勝者では、ユーザーインターフェイスです。これは、GTKグラフィックスをネイティブにサポートし、Bashよりもはるかに直感的であるため、ローカルアプリケーションまたはクライアントサーバーアプリケーションを構築するための優れた言語になります。
Bashはテキストのみを理解します。他のツールは、GUIとそれらから返されるデータのために呼び出される必要があります。Pythonのスクリプトは一つの選択肢です。YAD、Zenity、GTKDialogなどのバイナリは、高速ですが柔軟性が低くなります。
以下のような殻ながらバッシュのようなGUIを持つだけでなく、作業ヤド、GtkDialog(埋め込まれたXMLのようなGTK +の機能へのインタフェース)、ダイアログ、およびxmessage、Pythonは、複雑なGUIウィンドウのためにはるかにできるので、より良いです。
シェルスクリプトを使用したビルドは、デスクトップPCのように既製のコンポーネントを使用してコンピューターを組み立てるようなものです。
建物のPython、C ++またはほとんど他の言語は、より一緒にスマートフォンされている方法をチップ(ライブラリ)やその他の電子部品をはんだ付けすることにより、コンピュータを構築するようなものです。
通常、最良の結果を得るには、それぞれが最も得意なことを実行できる言語の組み合わせを使用します。ある開発者はこれを「ポリグロットプログラミング」と呼んでいます。
一般に、bashは、pythonが使用できない環境でのみ、pythonよりも適切に機能します。:)
真剣に、私は毎日両方の言語に対処する必要があり、選択が与えられればbashよりもすぐにpythonを使用します。悲しいかな、誰かが(誤って、私見)pythonが「大きすぎる」と判断したため、特定の「小さな」プラットフォームでbashを使用せざるを得ません。
一部の選択されたタスクではbashがpythonよりも高速である可能性があることは事実ですが、開発が速くなることも、維持するのが容易になることもありません(少なくとも10行以上のコードを取得した後は)。Bashの唯一の強みは、python、ruby、luaなどです。
os
やshutil
モジュールのコマンドよりもはるかに遅くなります。
bashとPythonの両方が賢明な選択であるシナリオでは、開発者の効率ははるかに重要です。
一部のタスクはbashに適しており、他のタスクはPythonに適しています。また、何かをbashスクリプトとして開始し、数週間かけて進化するにつれてPythonに変更することも珍しくありません。
Pythonの大きな利点は、ファイル名の処理に関してまれなケースですが、一般的なスクリプトのニーズに対応するglob、shutil、subprocessなどがあります。
スクリプトを作成する場合、パフォーマンスは重要ではありません(ほとんどの場合)。
パフォーマンスを重視する場合、 'Python vs Bash'は誤った質問です。
Python:
+書き込みが
簡単+メンテナンスが
簡単+コードの再利用が簡単(一般的なエラーのない、一般的なコードを含むファイルを含める方法を見つけてみてsh
ください)
+ OOPも使用できます!
+より簡単な引数解析。まあ、正確ではありません。それでも私の好みには言い過ぎですが、Pythonにはargparse
機能が組み込まれています
。-醜い醜い「サブプロセス」。コマンドを連鎖させ、コードがどれほど醜くなるかを川に流さないようにしてください。特に終了コードを気にする場合。
Bash:
+すでに述べたように、確かにユビキタス。
+単純なコマンドの連鎖。これは、さまざまなコマンドを簡単な方法で結合する方法です。また、Bash
(ではないsh
)のようないくつかの改善点があるpipefail
ため、連鎖は本当に短く、表現力があります。
+サードパーティのプログラムをインストールする必要はありません。すぐに実行できます。
-神様、それは落とし穴でいっぱいです。IFS、CDPATH ..それらの数千。
100 LOCを超えるスクリプトを作成する場合:Pythonを選択
するスクリプトでパス操作が必要な場合:Python(3)を選択
する多少似ているalias
が少し複雑である必要がある場合:Bash / shを選択する
とにかく、彼らは何ができるのかという考えを得るために両側を試してみるべきです。
おそらく、パッケージングとIDEサポートポイントで答えを拡張できるかもしれませんが、私はこの側面についてはよく知りません。
いつものように、あなたは芝生のサンドイッチと巨大な潅水から選ばなければなりません。覚えておいてください、ほんの数年前にPerlは新しい希望でした。それが今どこにあるのか。
パフォーマンスに関するbashは、プロセスの起動時間においてpythonよりも優れています。
Linux Mintを実行している私のコアi7ラップトップからのいくつかの測定値は次のとおりです。
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
* Pythonで読み込まれるライブラリは、os、os.path、json、time、requests、threading、subprocessです。
これは大きな違いを示していますが、bashの実行時間は、通常は外部プロセスを呼び出さなければならないため、理にかなったことをしなければならない場合はすぐに低下します。
パフォーマンスを重視する場合は、bashを次の目的にのみ使用してください。
/bin/echo
、この程度の大きさでbashよりも優れているため、測定するのは困難です。したがって、bashを実行する代わりに、/bin/echo mycommand > named_pipe
(名前付きパイプまたはソケットへのコマンド/メッセージの出力)...を使用して、そのパイプからコマンド/命令を読み取って実行するバックグラウンドPythonプロセスを使用できます。したがって、bashは実際には適切な「初期費用の最適化」ではありません。
Bashは主にバッチ/シェルスクリプト言語であり、さまざまなデータタイプや、制御構造に関するさまざまな種類のサポートがはるかに少なく、互換性の問題は言うまでもありません。
どちらが速いですか?また、ここではリンゴとリンゴを比較していないためです。ASCIIテキストファイルを並べ替える必要があり、zcat、sort、uniq、sedなどのツールを使用している場合は、Pythonのパフォーマンスを賢く吸い上げます。
ただし、浮動小数点とさまざまな制御フローをサポートする適切なプログラミング環境が必要な場合は、Pythonが優先されます。BashとPythonで再帰的アルゴリズムを書いたとしたら、Pythonバージョンが1桁以上勝ちます。
簡単なユーティリティを最小限の労力でまとめるのを検討している場合は、bashが適しています。アプリケーションのラッパーの場合、bashは非常に貴重です。
1000行を超えるBashコードを維持するのは非常に骨が折れるため、改善を追加するために何度も何度も戻ってくる可能性のあるものは、おそらく(常にではありませんが)Pythonのような言語に適しています。Bashコードは、長くなるとデバッグにも苛立ちます。
これらの種類の質問の問題の一部は、私の経験から、シェルスクリプトは通常すべてカスタムタスクであることです。私が遭遇したシェルスクリプティングタスクはほとんどなく、すでに無料で利用できるソリューションがあります。
この遅い回答を投稿しているのは、Googleがこの質問を気に入っているからです。
問題とコンテキストは、実際にはツールではなくワークフローに関するものである必要があると思います。全体的な哲学は常に「仕事に適したツールを使用する」です。しかし、これが始まる前に、ツールで道に迷ったときに多くの人が忘れがちなこと、「仕事をやり遂げる」ことです。
完全に定義されていない問題がある場合、ほとんどの場合Bashから始めます。可読性と保守性の両方を備えた大規模なBashスクリプトの厄介な問題をいくつか解決しました。
しかし、問題がいつBashに求められるべきことを超え始めるのでしょうか?警告を出すために使用するいくつかのチェックがあります。
リストは続く。要するに、機能を追加するためにスクリプトを実行し続けるために一生懸命作業しているときは、Bashを離れるときです。
作業をPythonに移行することにしたとしましょう。Bashスクリプトがクリーンであれば、最初の変換は非常に簡単です。あなたのために最初のパスを行ういくつかのコンバーター/トランスレーターさえあります。
次の質問です:Pythonへの移行を何をあきらめますか?
外部ユーティリティへのすべての呼び出しは、subprocess
モジュール(または同等のもの)の何かでラップする必要があります。これには複数の方法があり、3.7まではそれを正しくするためにいくらかの努力が必要でした(3.7はsubprocess.run()
すべての一般的なケースを独自に処理するように改善されました)。
驚いたことに、Pythonには、キーボード(stdin)をポーリングするための、プラットフォームに依存しない標準の非ブロッキングユーティリティ(タイムアウト付き)がありません。Bash read
コマンドは、簡単なユーザー操作のための素晴らしいツールです。私の最も一般的な使用法は、ユーザーがキーを押すまでスピナーを表示し、ポーリング機能を実行して(各スピナーステップで)、物事がまだ正常に動作していることを確認することです。これは最初に現れるよりも難しい問題なので、私はしばしばBash:Expensiveを呼び出すだけですが、それは私が必要とすることを正確に行います。
組み込みシステムまたはメモリに制約のあるシステムで開発している場合、PythonのメモリフットプリントはBashの何倍も大きくなる可能性があります(当面のタスクによって異なります)。さらに、ほとんどの場合、メモリにはすでにBashのインスタンスが存在しますが、これはPythonの場合とは異なります。
一度実行するとすぐに終了するスクリプトの場合、Pythonの起動時間はBashの起動時間よりはるかに長くなる可能性があります。しかし、スクリプトに重要な計算が含まれている場合、Pythonはすぐに先に進みます。
Pythonは地球上で最も包括的なパッケージシステムを持っています。Bashが少しでも複雑になると、PythonにはおそらくBashのチャンク全体を単一の呼び出しにするパッケージが含まれます。ただし、使用する適切なパッケージを見つけることは、Pythonistaになるための最大かつ最も困難な部分です。幸い、GoogleとStackExchangeは友達です。
これが正確であるかどうかはわかりませんが、python / rubyは、多くの数学的計算を行うスクリプトに対して非常によく機能することがわかりました。それ以外の場合は、dc
またはその他の「任意の精度計算機」を使用する必要があります。それは非常に大きな痛みになります。Pythonを使用すると、floatとintをより詳細に制御でき、多くの計算を実行したり、場合によっては実行したりするのがはるかに簡単になります。
特に、バイナリ情報やバイトを処理するためにbashスクリプトを使用することは決してありません。代わりに、Python(たぶん)やC ++、さらにはNode.JSのようなものを使用します。
パフォーマンスに関しては、どちらも同じように同じことができるので、開発時間を節約するための質問になりますか?
Bashは他のコマンドを呼び出し、それらをパイプして新しいコマンドを作成することに依存しています。これには、使用するプログラミング言語に関係なく、他の人から借りたコードだけで新しいプログラムをすばやく作成できるという利点があります。
また、サブコマンド間のインターフェースはプレーンテキストであるため、サブコマンドの変更に抵抗するという副作用もあります。
さらに、Bashはそれをどのように書くことができるかについて非常に寛容です。これは、さまざまな状況でうまく機能することを意味しますが、プログラマがクリーンで安全な方法でコーディングすることを意図していることにも依存しています。そうでなければ、バッシュはあなたが混乱を構築するのを止めません。
Pythonはスタイルがより構造化されているため、厄介なプログラマーはそれほど厄介ではありません。また、Linux以外のオペレーティングシステムでも動作するため、この種の移植性が必要な場合は、即座に適切になります。
しかし、他のコマンドを呼び出すのは簡単ではありません。したがって、オペレーティングシステムがUnixである場合、Bashでの開発が最速の開発方法であることがわかります。
Bashを使用する場合:
Pythonを使用する場合: