Python対Bash-パフォーマンスに関して、それぞれが他のタスクをどのような種類のタスクで実行しますか?


97

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

この問題についてあなたの経験は何ですか?それぞれが明確な勝者となるタスクの種類はどれですか。


6
これは実際には投票ではありません。事前定義されたオプションはありません。どのツールがどの種類の作業を最も効果的に行うかについての洞察が必要です。
Doppelganger

回答:


94

一般的なメインフレームフロー...

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のパフォーマンスには言語全体の違いはありません。それは完全にそれぞれがどのようにコード化されているか、そしてどの外部ツールが呼び出されるかに依存します。

いずれのようなよく知られているツールの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 +の機能へのインタフェース)ダイアログ、およびxmessagePythonは、複雑なGUIウィンドウのためにはるかにできるので、より良いです。

概要

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

建物のPythonC ++またはほとんど他の言語は、より一緒にスマートフォンされている方法をチップ(ライブラリ)やその他の電子部品をはんだ付けすることにより、コンピュータを構築するようなものです。

通常、最良の結果を得るには、それぞれが最も得意なことを実行できる言語の組み合わせを使用します。ある開発者はこれを「ポリグロットプログラミング」と呼んでいます。


16
私はそれがどのように受け入れられる答えであるかを認識できていません。これらの2つがより適しているタスクについての洞察は提供されません。
警戒官

2
@vigilancer投稿された変更と追加がお役に立てば幸いです。
DocSalvager 2016年

1
私は他のコメントに同意しますが、これは質問に正確に答えるものではありません。これは、私が今まで読んだ中で最高の答えの1つです。
ジムミッチェナー

72

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

真剣に、私は毎日両方の言語に対処する必要があり、選択が与えられればbashよりもすぐにpythonを使用します。悲しいかな、誰かが(誤って、私見)pythonが「大きすぎる」と判断したため、特定の「小さな」プラットフォームでbashを使用せざるを得ません。

一部の選択されたタスクではbashがpythonよりも高速である可能性があることは事実ですが、開発が速くなることも、維持するのが容易になることもありません(少なくとも10行以上のコードを取得した後は)。Bashの唯一の強みは、python、ruby、luaなどです。


4
Pythonは、MacOSでさえも、すべてのLinux / Unixにすでにあるのではないですか?私はbashでどの操作がより高速であるのか知りたいです-私が理解したことから、異なる個別のコマンドを呼び出すと、Python osshutilモジュールのコマンドよりもはるかに遅くなります。
NoBugs 2015

1
@NoBugsそれは間違いなくすべての単一のLinux / Unixディストリビューションにはありません。それはほぼすべての主要なLinuxディストリビューション(debianベースのディストリビューション、slackwareなど)とMac OS Xで必ず発生しますが、yoctoyoctoproject.org)を使用して独自のisoを構築すると、すべてのパッケージを自分でカスタマイズします。しかし、今日の主要なUnix OSの場合は、少なくともpython2(おそらく)とおそらくpython3もインストールされると言っても安全でしょう。
dylnmc 2016

Pythonは、フル機能のGUIなどの複雑なタスクに最適なスクリプト言語です。同様に重要なのは、プログラムの保守が容易になるように適切なプログラミング方法を実施することです。バッシュが保守可能であるためには、他の場所で学んだ優れた慣行を課す必要があります。そうすることで、GUIダイアログユーティリティまたはPython for UIを使用すると、優れたUX(Bashから呼び出される非常に高速なユーティリティプログラムを介して)の優れたパフォーマンスが得られます。
DocSalvager 2018

34

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

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

Pythonの大きな利点は、ファイル名の処理に関してまれなケースですが、一般的なスクリプトのニーズに対応するglobshutilsubprocessなどがあります。


5
この質問は、開発者のパフォーマンスではなくマシンのパフォーマンスを意味する「パフォーマンスごとの」比較を目的としています。別の回答で私のパフォーマンステストを参照してください。
Grzegorz Luczywo 2014

25

スクリプトを作成する場合、パフォーマンスは重要ではありません(ほとんどの場合)。
パフォーマンスを重視する場合、 'Python vs Bash'は誤った質問です。

Python
+書き込みが
簡単+メンテナンスが
簡単+コードの再利用が簡単(一般的なエラーのない、一般的なコードを含むファイルを含める方法を見つけてみてshください)
+ OOPも使用できます!
+より簡単な引数解析。まあ、正確ではありません。それでも私の好みには言い過ぎですが、Pythonにはargparse機能が組み込まれています
。-醜い醜い「サブプロセス」。コマンドを連鎖させ、コードがどれほど醜くなるかを川に流さないようにしてください。特に終了コードを気にする場合。

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

100 LOCを超えるスクリプトを作成する場合:Pythonを選択
するスクリプトでパス操作が必要な場合:Python(3)を選択
する多少似ているaliasが少し複雑である必要がある場合:Bash / shを選択する

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

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

いつものように、あなたは芝生のサンドイッチと巨大な潅水から選ばなければなりません。覚えておいてください、ほんの数年前にPerlは新しい希望でした。それが今どこにあるのか。


4
はい、bashを含むコードは永久に存続します。私はたくさんのPerlをコーディングしましたが、それらは今では役に立たないのです。
Raymond gsh

見方だけで...私が毎日書いている、私が書いた現在最大のスクリプトは、実際の非コメントまたは空白行のbashコードの4121行に相当します。豊富なコメントなどで、7261行にしています。それは、別の6650行であるすべての関数のマンページのようなドキュメントのヘルプファイルを伴います。すべての関数には、現在3つのバージョンのYAD、Zenity、ダイアログ、またはプレーンなCLIテキストが含まれている、利用可能な最良の出力形式でヘルプテキストを即座に取得して表示できるオプションがあります。私はそれを「キット」と呼びます。これを書いている時点ではバージョン44です。
DocSalvager 2018年

これは重い!(C)
vigilancer

1
LoCがPythonを選択する決定的な要因であるとは思わない。さらに、あなたがしている仕事はどれくらい複雑ですか?100個のコマンドをチェーニングしているだけで問題ない場合、bashで30 LoCのみの場合は、Pythonで理解する方が簡単です。Pythonを使用してください。
JFord

@アキトは何も触れないで大丈夫です。しかし、問題が発生する可能性のあるいくつかの状況が終了しました。それをデフォルト以外に設定し、それをクリアするのを忘れました。外部で何かが変更されましたが、スクリプトはデフォルトに依存しています。一部のツールは暗黙的にそれを使用するため、常にIFSを念頭に置く必要があります。
警官

22

パフォーマンスに関する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に配置します

...そして/bin/echo、この程度の大きさでbashよりも優れているため、測定するのは困難です。したがって、bashを実行する代わりに、/bin/echo mycommand > named_pipe(名前付きパイプまたはソケットへのコマンド/メッセージの出力)...を使用して、そのパイプからコマンド/命令を読み取って実行するバックグラウンドPythonプロセスを使用できます。したがって、bashは実際には適切な「初期費用の最適化」ではありません。
Cezary Baginski、2015

通常、タスクが本当に短くて速い場合は、プロセスではなくスレッドを使用することになっています。複数のプロセスは高レベルなものであり、プロセスの開始が0.5秒以内である限り、ほとんどの場合それはかなり合理的であると思いませんか。
ティモシースワン

16

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

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

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


13
だから私の怒りの全体的な道徳は、適切な仕事に適切なツールを使用することです。
ジャスティン

2
浮動小数点は、awk、bcなどのツールとzsh / kshなどのシェルでサポートされています。
ghostdog74 2010年

4
これらのツールはBashではないからです。私は明確な違いを指摘していました。これらのツールはシェルスクリプトで使用されますが、ネイティブのBash自体は浮動小数点をサポートしていません。
ジャスティン

2
いいえ。自分で試してください。大きなログファイルをgzipし、zcat、sortなどを使用してフィルタリングを行ってから、ネイティブPythonライブラリを使用します。ネイティブツールを使用すると、大幅に高速化されます。
ジャスティン

6
@justin、はい、これらのツールはBashではありませんが、古くからあり、シェルスクリプトでよく使用されています。浮動小数点が必要な場合は、awk / bcを使用してください。シェルスクリプトをPythonと同じくらい強力にするこれらのツールの組み合わせです。
ghostdog74 2010年

12

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

1000行を超えるBashコードを維持するのは非常に骨が折れるため、改善を追加するために何度も何度も戻ってくる可能性のあるものは、おそらく(常にではありませんが)Pythonのような言語に適しています。Bashコードは、長くなるとデバッグにも苛立ちます。

これらの種類の質問の問題の一部は、私の経験から、シェルスクリプトは通常すべてカスタムタスクであることです。私が遭遇したシェルスクリプティングタスクはほとんどなく、すでに無料で利用できるソリューションがあります。


8

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

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

とはいえ、私は通常、スクリプト言語自体のパフォーマンスにはあまり関心がありません。パフォーマンスが実際の問題である場合は、スクリプトではなくプログラムを作成します(おそらくPythonで)。


4

この遅い回答を投稿しているのは、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)をポーリングするための、プラットフォームに依存しない標準の非ブロッキングユーティリティ(タイムアウト付き)がありません。Bash readコマンドは、簡単なユーザー操作のための素晴らしいツールです。私の最も一般的な使用法は、ユーザーがキーを押すまでスピナーを表示し、ポーリング機能を実行して(各スピナーステップで)、物事がまだ正常に動作していることを確認することです。これは最初に現れるよりも難しい問題なので、私はしばしばBash:Expensiveを呼び出すだけですが、それは私が必要とすることを正確に行います。

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

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

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


2

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

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


Bash演算は厳密に整数であるため、何か(awkやdcなど)を呼び出して出力をキャプチャすることにより、浮動小数点演算を実行する必要があります。多くの場合、単純な金銭的な処理は、100を掛けて出力の小数点を調整するだけで、内部で実行できます。
DocSalvager

0

パフォーマンスに関しては、どちらも同じように同じことができるので、開発時間を節約するための質問になりますか?

Bashは他のコマンドを呼び出し、それらをパイプして新しいコマンドを作成することに依存しています。これには、使用するプログラミング言語に関係なく、他の人から借りたコードだけで新しいプログラムをすばやく作成できるという利点があります。

また、サブコマンド間のインターフェースはプレーンテキストであるため、サブコマンドの変更に抵抗するという副作用もあります。

さらに、Bashはそれをどのように書くことができるかについて非常に寛容です。これは、さまざまな状況でうまく機能することを意味しますが、プログラマがクリーンで安全な方法でコーディングすることを意図していることにも依存しています。そうでなければ、バッシュはあなたが混乱を構築するのを止めません。

Pythonはスタイルがより構造化されているため、厄介なプログラマーはそれほど厄介ではありません。また、Linux以外のオペレーティングシステムでも動作するため、この種の移植性が必要な場合は、即座に適切になります。

しかし、他のコマンドを呼び出すのは簡単ではありません。したがって、オペレーティングシステムがUnixである場合、Bashでの開発が最速の開発方法であることがわかります。

Bashを使用する場合:

  • それは非グラフィカルなプログラム、またはグラフィカルなプログラムのエンジンです。
  • Unix専用です。

Pythonを使用する場合:

  • それはグラフィカルなプログラムです。
  • Windowsで動作します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.