web-dev-qa-db-ja.com

Python vs Bash-それぞれのタスクが他のパフォーマンスよりもどの種類のタスクを上回るか?

明らかにPythonはユーザーフレンドリーで、グーグルでクイック検索を行うと、Pythonはバイトコンパイルされる方が通常は高速です。多くの結果が表示されます。 this 辞書ベースの操作で2000%以上の改善が見られると主張しています。

この件に関するあなたの経験は何ですか?どの種類のタスクでそれぞれが明確な勝者ですか?

83
Doppelganger

典型的なメインフレームフロー...

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                          |
                                   :                          :

シェルはLinuxの接着剤です

Sh/ksh /bash/ ...などのLinuxシェルは、古いメインフレームのジョブ制御言語によく似た入力/出力/フロー制御の指定機能を提供します... O-Sがサポートする任意の言語で記述された他の実行プロセスとの間でデータと制御を効率的にやり取りするように最適化されている一方で、 完全な言語のチューニング .

ほとんどのLinuxアプリケーションは、プログラムの大部分がどの言語で書かれているかにかかわらず、シェルスクリプトに依存しており、Bashが最も一般的になっています。通常、デスクトップ上のアイコンをクリックすると、短いBashスクリプトが実行されます。そのスクリプトは、直接的または間接的に、必要なすべてのファイルの場所を認識し、変数とコマンドラインパラメーターを設定し、最終的にプログラムを呼び出します。それはシェルの最も簡単な使用法です。

しかし、Linuxは、システムを起動し、イベントに応答し、実行優先順位を制御し、プログラムをコンパイル、構成、実行する何千ものシェルスクリプトがなければLinuxにはなりません。これらの多くは非常に大きく複雑です。

シェルは、コンパイル時ではなく実行時にリンクされているビルド済みコンポーネントを使用できるインフラストラクチャを提供します。これらのコンポーネントは、単独で、または再コンパイルせずに他の組み合わせで使用できる独立したプログラムです。それらを呼び出すための構文は、Bash組み込みコマンドの構文と見分けがつかず、実際にはシステム上にスタンドアロンの実行可能ファイルもある多くの組み込みコマンドがあります。追加オプションがあります。

PythonBashのパフォーマンスに言語全体の違いはありません。それはそれぞれがどのようにコーディングされ、どの外部ツールが呼び出されるかに完全に依存します。

Anyawk、sed、grep、bc、dc、tr、などのよく知られているツールは、ほこり。 Bashは、Bashのようなツールからデータを呼び出して返送する方が簡単で効率的であるため、グラフィカルユーザーインターフェイスを持たないものに適していますよりPython

性能

Bashシェルスクリプトが呼び出すプログラムと、与えられたサブタスクに対するそれらの適合性に依存します。全体的なスループットや応答性が同等のPython。問題を複雑にするためにPythonは、ほとんどの言語と同様に他の実行可能ファイルを呼び出すこともできます。

ユーザーインターフェース

Pythonが明確な勝者である1つの領域は、ユーザーインターフェイスです。 GTKグラフィックスをネイティブにサポートし、Bashよりもはるかに直感的であるため、ローカルまたはクライアントサーバーアプリケーションを構築するための優れた言語になります。

Bashはテキストのみを理解します。 GUIから他のツールを呼び出して、そこからデータを返す必要があります。 Pythonスクリプトは1つのオプションです。より高速だが柔軟性の低いオプションは、YAD、Zenity、GTKDialogなどのバイナリです。

Bashのようなシェルは YadGtkDialog(GTK +関数への組み込みXMLのようなインターフェース) 、-のようなGUIでうまく機能します dialog 、および xmessagePythonは通常、より簡単で、より能力があります。

概要

シェルスクリプトを使用したビルドは、デスクトップPCと同じように、市販のコンポーネントを使用してコンピューターを組み立てるようなものです。

PythonC++、または他のほとんどの言語を使用したビルドは、チップ(ライブラリ)やその他の電子機器をはんだ付けしてコンピューターをビルドするようなものですスマートフォンのようにパーツをまとめます。

79
DocSalvager

一般的に、bashはpythonよりもうまく機能します。pythonが利用できない環境でのみ。:)

真剣に、私は両方の言語を毎日処理する必要があり、選択が与えられるとpython即座にbashを使用します。残念ながら、誰かが(間違って、私見)pythonは「大きすぎる」と判断しました。

一部の選択タスクでは、bashがpythonよりも高速である可能性がありますが、少なくとも10行を超えた後では、開発が迅速に行われず、保守も容易になりません。コードなど)。Bashの唯一の長所wrt pythonまたはRubyまたはluaなど)は、その遍在性です。

69
Kevin Little

開発者の効率は、bashとPythonの両方が賢明な選択であるシナリオでは、私にとって非常に重要です。

一部のタスクはbashに適していますが、他のタスクはPythonに適しています。また、bashスクリプトとして何かを開始し、それをPythonが数週間にわたって進化するにつれて、それを変更することも珍しくありません。

大きな利点Pythonが持っているのは、ファイル名の取り扱いに関するコーナーケースの場合ですが、 globshutilsubprocess =、およびその他の一般的なスクリプトのニーズ。

32
Roger Pate

スクリプトを記述するとき、パフォーマンスは重要ではありません(ほとんどの場合)。
パフォーマンスに関心がある場合、「Python vs Bash」は間違った質問です。

Python
+書きやすい
+メンテナンスが簡単
+より簡単なコードの再利用(共通のコードを持つファイルをshに含める普遍的なエラー防止方法を見つけてみてください。
+次のことができますOOPそれでも!
+より簡単な引数解析。まあ、簡単ではない、正確に。私の好みにはまだ言葉が長すぎますが、python have argparse facility in built。
-いい「サブプロセス」。コードがどれだけくなるかを川で泣かないでください。特に終了コードを気にする場合。

バッシュ
+ユビキタス、以前に言ったように、確かに。
+単純なコマンドチェーン。これが、さまざまなコマンドを簡単な方法で結合する方法です。また、Bashshではなく)にはpipefailなどのいくつかの改善点があるため、チェーンは本当に短く、表現力に富んでいます。
+では、サードパーティのプログラムをインストールする必要はありません。すぐに実行できます。
-神、それは落とし穴でいっぱいです。 IFS、CDPATH ..それらの数千。

100 LOCを超えるスクリプトを作成する場合:Pythonを選択します
スクリプトでパス操作が必要な場合:Python(3)を選択します
aliasのように多少必要ですが、やや複雑な場合:Bash/shを選択します

とにかく、彼らは何ができるのか考えを得るために両側を試してみるべきです。

パッケージングとIDEサポートポイントで答えを拡張できるかもしれませんが、私はこの側面に精通していません。

いつものように、糞サンドイッチと巨大な潅水から選択する必要があります。そして、ほんの数年前、Perlは新しい希望であったことを思い出してください。今のところ。

23
vigilancer

パフォーマンスに関する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を次の目的にのみ使用してください。

  • 本当にシンプルで頻繁に呼び出されるスクリプト
  • 主に他のプロセスを呼び出すスクリプト
  • 手動の管理アクションとスクリプトの間に最小限の摩擦が必要な場合-いくつかのコマンドをすばやくチェックして、file.shに配置します
19

Bashは主に、互換性の問題は言うまでもなく、さまざまなデータ型や制御構造に関するあらゆる種類の癖に対するサポートがはるかに少ないバッチ/シェルスクリプト言語です。

どちらが速いですか?どちらも、ここではリンゴとリンゴを比較していないからです。 ASCIIテキストファイルを並べ替える必要があり、zcat、sort、uniq、sedなどのツールを使用していた場合は、Pythonパフォーマンスに関して賢明です。

ただし、浮動小数点とさまざまな制御フローをサポートする適切なプログラミング環境が必要な場合は、Pythonが勝者となります。BashとPythonで再帰アルゴリズムを書いた場合、Pythonバージョンは1桁以上で勝ちます。

16
Justin

最小限の労力で簡単なユーティリティを組み合わせることを検討している場合は、bashが適しています。アプリケーションをラップするラッパーの場合、bashは非常に貴重です。

何度も何度も改良を加えるために戻ってくる可能性のあるものは、おそらく(常にではありませんが)Pythonのような言語に適しています。 Bashコードは、長くなるとデバッグするのもイライラします。

この種の質問の問題の一部は、私の経験から、シェルスクリプトは通常すべてカスタムタスクであるということです。既に無料で利用可能なソリューションがある場所で出会ったシェルスクリプトタスクはほとんどありませんでした。

12
zamhassam

Bashのパフォーマンスが少なくとも同等である2つのシナリオがあります。

  • コマンドラインユーティリティのスクリプト
  • 実行に短い時間しかかからないスクリプト。 Pythonインタープリターを開始すると、操作自体よりも時間がかかります

そうは言っても、私は通常、スクリプト言語自体のパフォーマンスにはあまり関心がありません。パフォーマンスが本当の問題である場合、スクリプトではなくプログラム(おそらくPython)を使用します。

8
extraneon

これが正確かどうかはわかりませんが、python/Rubyは、数学的な計算が多いスクリプトの方がはるかに優れていることがわかりました。それ以外の場合は、dcまたは他の「任意精度の計算機」を使用する必要があります。とても大きな痛みになります。 pythonを使用すると、floatとintをより細かく制御でき、多くの計算を実行することがはるかに簡単になります。

特に、bashスクリプトを使用してバイナリ情報またはバイトを処理することはありません。代わりに、python(おそらく)またはC++またはNode.JSのようなものを使用します。

2
dylnmc

主にGoogleがこの質問を気に入っているため、この遅い回答を投稿しています。

問題とコンテキストは、ツールではなく、ワークフローに関するものであるべきだと思います。全体的な哲学は常に「仕事に適切なツールを使用する」ことです。しかし、この前に、多くの場合、ツールで迷子になったときに忘れてしまうものがあります。「仕事をやりなさい」。

完全に定義されていない問題がある場合、ほとんど常にBashから始めます。読み取りと保守の両方が可能な大規模なBashスクリプトのいくつかの厄介な問題を解決しました。

しかし、Bashに求められることを超えると、問題はいつ始まりますか?警告を出すために使用するチェックがいくつかあります。

  1. Bashに2D(またはそれ以上)の配列があればいいのに?はいの場合は、Bashが優れたデータ処理言語ではないことに気付くときです。
  2. 実際にそれらのユーティリティを実行しているよりも、他のユーティリティのデータの準備に多くの作業を行っていますか?もしそうなら、Bashを実現するための時間は素晴らしいデータ処理言語ではありません。
  3. 私のスクリプトは単に管理するには大きすぎますか?はいの場合、Bashはスクリプトライブラリをインポートできますが、他の言語のようなパッケージシステムがないことを認識することが重要です。他のほとんどの言語と比較して、実際には「独自のロール」言語です。繰り返しになりますが、これには膨大な量の機能が組み込まれています(言い過ぎです...)

リストは続きます。要するに、機能を追加するというスクリプトを実行し続けるために一生懸命働いているときは、Bashを離れるときです。

作業をPythonに移行することにしたと仮定しましょう。 Bashスクリプトがクリーンであれば、最初の変換は非常に簡単です。あなたのための最初のパスを行ういくつかのコンバータ/トランスレータさえあります。

次の質問は、Pythonへの移行をあきらめますか?

  1. 外部ユーティリティへのすべての呼び出しは、subprocessモジュール(または同等のもの)からの何かでラップする必要があります。これを行うには複数の方法があり、3.7まではそれを正しくするために多少の努力が必要でした(3.7はsubprocess.run()を改善し、すべての一般的なケースを単独で処理しました)。

  2. 驚いたことに、Pythonには、キーボード(stdin)をポーリングするための、プラットフォームに依存しない標準のノンブロッキングユーティリティ(タイムアウト付き)がありません。Bashreadコマンドは、シンプルなユーザー私の最も一般的な使用法は、ユーザーがキーを押すまでスピナーを表示すること、また、各スピナーのステップでポーリング機能を実行して、物事がまだ正常に実行されていることを確認することです。 、だから私はしばしばBash:高価な呼び出しをするだけですが、それは私が必要とするものを正確に行います。

  3. 組み込みシステムまたはメモリに制約のあるシステムで開発している場合、Pythonのメモリフットプリントは、Bashのメモリフットプリントよりも数倍大きくなることがあります(手元のタスクによって異なります)。さらに、ほとんどの場合、既にメモリにBashのインスタンスが既に存在しますが、Pythonの場合はそうではありません。

  4. 一度実行してすぐに終了するスクリプトの場合、Pythonの起動時間はBashの起動時間よりはるかに長くなる可能性があります。しかし、スクリプトに重要な計算が含まれている場合、Pythonはすぐに先に進みます。

  5. Pythonには、地球上で最も包括的なパッケージシステムがあります。 Bashがわずかに複雑になると、PythonはおそらくBashのチャンク全体を1回の呼び出しにするパッケージを持っています。しかし、使用する適切なパッケージを見つけることが最大かつ最も困難な部分です。幸いなことに、GoogleとStackExchangeはあなたの友達です。

1
BobC