なぜ Python スクリプトをコンパイルするのですか? .py ファイルから直接実行できますが、正常に動作します。パフォーマンス上の利点などはありますか?
また、アプリケーション内の一部のファイルは .pyc にコンパイルされ、他のファイルはコンパイルされないことに気付きました。これはなぜですか?
なぜ Python スクリプトをコンパイルするのですか? .py ファイルから直接実行できますが、正常に動作します。パフォーマンス上の利点などはありますか?
また、アプリケーション内の一部のファイルは .pyc にコンパイルされ、他のファイルはコンパイルされないことに気付きました。これはなぜですか?
これは、はるかに高速に使用できるバイトコードにコンパイルされます。
一部のファイルがコンパイルされない理由はpython main.py
、スクリプトを実行するたびに呼び出すメイン スクリプトが再コンパイルされるためです。インポートされたスクリプトはすべてコンパイルされ、ディスクに保存されます。
Ben Blankによる重要な追加:
コンパイルされたスクリプトを実行すると、 (コンパイルする必要がないため)起動時間が短縮されますが、実行速度が速くなるわけではないことに注意してください。
.pyc ファイルは、既にバイトコードにコンパイルされている Python です。呼び出した .py ファイルと同じ名前の .pyc ファイルが見つかった場合、Python は自動的に .pyc ファイルを実行します。
「Python の紹介」では、コンパイルされた Python ファイルについて次のように述べています。
プログラムは、「.pyc」または「.pyo」ファイルから読み取られた場合、「.py」ファイルから読み取られた場合よりも速く実行されません。「.pyc」または「.pyo」ファイルの唯一の高速化は、それらの読み込み速度です。
.pyc ファイルを実行する利点は、Python が実行前にコンパイルのオーバーヘッドを負う必要がないことです。いずれにせよ、Python は .py ファイルを実行する前にバイトコードにコンパイルするため、それ以外にパフォーマンスが向上することはありません。
コンパイルされた .pyc ファイルを使用すると、どの程度改善できますか? それは、スクリプトが何をするかによって異なります。「Hello World」を出力するだけの非常に短いスクリプトの場合、コンパイルは、起動と実行の合計時間の大部分を占める可能性があります。ただし、実行時間の長いスクリプトほど、総実行時間に対するスクリプトのコンパイルのコストは小さくなります。
コマンドラインで名前を付けたスクリプトは、.pyc ファイルに保存されることはありません。その「メイン」スクリプトによってロードされたモジュールのみがその方法で保存されます。
プラス:
1 つ目: 軽度で打ち負かすことのできる難読化。
2 つ目: コンパイルによってファイルが大幅に小さくなると、読み込み時間が短縮されます。ウェブに最適です。
3 番目: Python はコンパイル手順をスキップできます。初期ロード時の速度が向上します。CPU と Web に最適です。
4 つ目: コメントが多いほど、ファイルはソース ファイルと比較して小さく.pyc
なり.pyo
ます.py
。
.pyc
第 5 に、またはファイルしか手元にないエンド ユーザーは、.pyo
元に戻されていない変更が原因でバグが発生する可能性がはるかに低くなります。
6 番目: 組み込みシステムを目指している場合、組み込み用に小さいサイズのファイルを取得することは大きなプラスになる可能性があり、アーキテクチャは安定しているため、以下に詳述する欠点 1 は影響しません。
トップレベルのコンパイル
.pyc
トップ レベルの Python ソース ファイルを次の方法でファイルにコンパイルできることを知っておくと便利です。
python -m py_compile myscript.py
これにより、コメントが削除されます。docstrings
そのまま残します。も削除したい場合はdocstrings
(なぜそうしているのかを真剣に考えたいと思うかもしれません)、代わりにこの方法でコンパイルしてください...
python -OO -m py_compile myscript.py
...そして、.pyo
ファイルの代わりにファイルを取得し.pyc
ます。コードの本質的な機能に関しては均等に配布できますが、取り除かれた分だけサイズが小さくなりますdocstrings
(また、最初からまともな機能を持っていたとしても、その後の使用で理解されにくくなりますdocstrings
)。ただし、以下の欠点 3 を参照してください。
Python は、ファイルの日付が存在する場合は、それを使用して、またはファイルではなくファイルを.py
実行するかどうかを決定することに注意してください --- したがって、.py ファイルを編集すると、orは廃止され、得た利点はすべて失われます。またはの利点を再び元に戻すには、再コンパイルする必要があります。.py
.pyc
.pyo
.pyc
.pyo
.pyc
.pyo
欠点:
最初に: Python ファイルがコンパイルされたシステム アーキテクチャを示す "マジック クッキー".pyc
と.pyo
ファイルがあります。これらのファイルの 1 つを別のタイプの環境に配布すると、壊れます。.pyc
または.pyo
を関連付けずに配布し.py
て再コンパイルするか、またはtouch
に取って代わる場合、エンド ユーザーもそれを修正できません。.pyc
.pyo
2 つ目:上記のようにコマンド ライン オプションをdocstrings
使用してスキップされた場合-OO
、誰もその情報を取得できず、コードの使用がより困難 (または不可能) になる可能性があります。
3 番目: Python のオプションは、コマンド ライン オプション-OO
に従っていくつかの最適化も実装します。-O
これにより、動作が変更される場合があります。既知の最適化は次のとおりです。
sys.flags.optimize
= 1assert
ステートメントはスキップされます__debug__
= 偽4 番目: 最初の行のオーダーで意図的に Python スクリプトを実行可能にした場合、これはandファイル#!/usr/bin/python
で取り除かれ、その機能は失われます。.pyc
.pyo
5 つ目: やや明白ですが、コードをコンパイルすると、その使用に影響を与えるだけでなく、他の人があなたの作業から学ぶ可能性が、しばしば大幅に低下します。
コンパイル済みの Python を実行すると、パフォーマンスが向上します。ただし、インポートされたモジュールとして .py ファイルを実行すると、python はそれをコンパイルして保存し、.py ファイルが変更されない限り、常にコンパイルされたバージョンを使用します。
ファイルが使用される場合、どの言語でも、プロセスは次のようになります
。 1. ファイルはインターピーターによって処理されます。
2. ファイルがコンパイルされ
ます。 3. コンパイルされたコードが実行されます。
明らかに、コンパイル済みのコードを使用することで、ステップ 2 を省略できます。これは、python、PHP などに適用されます。
違いを説明する興味深いブログ投稿がありますhttp://julipedia.blogspot.com/2004/07/compiled-vs-interpreted-languages.html
そして、ここに Python コンパイル プロセスを説明するエントリがありますhttp://effbot.org/zone /python-compile.htm
既に述べたように、Python コードをバイトコードにコンパイルすると、パフォーマンスが向上します。これは通常、インポートされたスクリプトに対してのみ、python 自体によって処理されます。
Python コードをコンパイルするもう 1 つの理由は、知的財産をコピーや変更から保護することです。
詳細については、Python ドキュメントを参照してください。
コンパイルされたスクリプトを実行すると、確かにパフォーマンスに違いがあります。通常の.py
スクリプトを実行すると、実行するたびにマシンがコンパイルするため、時間がかかります。最近のマシンでは、これはほとんど目立ちませんが、スクリプトが大きくなるにつれて問題が大きくなる可能性があります。
コンパイルされたコードを使用して、ソース コードにアクセスできないユーザーに配布します。基本的には、経験の浅いプログラマーが誤って何かを変更したり、バグを修正したりするのを防ぐためです。
そうです、パフォーマンスが主な理由であり、私の知る限り唯一の理由です。
一部のファイルがコンパイルされていない場合は、おそらくディレクトリのアクセス許可などが原因で、Python が .pyc ファイルに書き込めない可能性があります。または、コンパイルされていないファイルがロードされていない可能性があります... (スクリプト/モジュールは、最初にロードされたときにのみコンパイルされます)
初心者は、.pyc ファイルのために Python がコンパイルされていると想定します。.pyc ファイルはコンパイルされたバイトコードであり、その後解釈されます。したがって、以前に Python コードを実行したことがあり、.pyc ファイルが手元にある場合、バイトコードを再コンパイルする必要がないため、2 回目はより高速に実行されます。
コンパイラ: コンパイラは、高級言語を機械語に変換するコードの一部です。
インタープリター: インタープリターは、高水準言語を機械可読のバイナリ形式に変換します。インタープリターは、実行する高級言語コードを取得するたびに、そのコードを機械語に変換する前に中間コードに変換します。コードの各部分が解釈され、シーケンスで個別に実行されます。コードの一部にエラーが見つかった場合、次のコード セットを変換せずにコードの解釈を停止します。
出典: http://www.toptal.com/python/why-are-there-so-many-pythons http://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter