

pythonのコードをコンパイルできると知り、実効速度を比べてみました。

[code]

    for i in range(0, 1000000):
        print i
    
[/code]

こちらのコードで比較しています。

[code]

    $ time python main.py
    python main.py  0.80s user 0.64s system 71% cpu 2.000 total
    
    $ time python main.py
    python main.pyc  0.79s user 0.64s system 68% cpu 2.074 total
    
[/code]

コンパイルと聞いたので、Javaなどのように単純に実行速度が早くなるのかと思ったのですが、変わりませんでした。  
どのような時に有効で、どのようなときに使われるのが一般的なのかおしえていただけますか。


CC BY-SA 3.0
2015-12-20T10:59:06.917
20216
2015-12-29T06:26:57.990
9149
question
python
バイトコンパイルってどういう時に使うんですか?


python のような言語はソースを一旦バイトコードと言われる疑似言語に変換して実行します。  
なので、あらかじめバイトコードに変換したものを使うとそのソースからの変換の部分の時間が省略できることになります。  
だから、非常に長いようなソースの場合効果があると思われます。（逆に短いソースの場合はほとんど効果が感じられないかもしれないし、逆に読み込む時間が長くなるという逆効果の場合もあるかもしれません）

また、ソースを直接他の人に読ませたくない場合などに使えるかもしれません。


CC BY-SA 3.0
2015-12-20T11:13:45.177
20217
2015-12-20T11:13:45.177
5044
20216
answer


> Python は C やその他の言語のように機械語にコンパイルできますか？  
>  <http://docs.python.jp/2.7/faq/design.html?highlight=pyc#python-c>
>
> 内部的には、Python のソースコードはいつもバイトコード表現に翻訳されていて、そのバイトコードが
> Pythonの仮想マシンによって実行されます。めったに変更されないモジュールの解析が繰り返されることによるオーバーヘッドを避けるため、このバイトコードはモジュールが解析されるたびに名前が”.pic”
> で終わるファイルに書きこまれます。対応する .py ファイルが変更されたとき、そのファイルは再び解析および翻訳されて .pyc
> ファイルは書き直されます。
>
> 一旦 .pyc ファイルが読み込まれればパフォーマンスの差はなく、 .pyc
> ファイルから読み込まれたバイトコードも、直接の変換により生成されたバイトコードも全く同じです。唯一の違いは、.pyc ファイルからコードを読み込むのは
> .py ファイルを解析して翻訳するのよりも速いことなので、予めコンパイルされた .pyc ファイルがあると Python
> スクリプトの起動時間が改善します。必要なら、 Lib/compileall.py モジュールで、与えられたモジュール群の適切な .pyc
> ファイルを生成できます。


CC BY-SA 3.0
2015-12-20T14:15:29.620
20223
2015-12-20T14:15:29.620
806
20216
answer


*.pycファイルはあくまで構文解析部分を予め実行したものでしかありません。  
もし"Javaなどのよう"なコンパイルを望むのなら、実行時に機械語にコンパイルしてから実行する(JIT)インタプリタ実装であるPyPy、あるいは関数単位でLLVMにコンパイルするライブラリのNumbaなどを試して見るべきでしょう。

<http://pypy.org/>  
<http://numba.pydata.org/>

以下は個人的な印象の話になりますが、  
PyPyは汎用な、通常の`python`コマンドを置き換える目的で開発されているため、pure python  
のコードはよく動きますが、Cで拡張されている場合などは完全な互換性が期待できない状態だと認識しています。  
NumbaはNumPyベースのため、数値計算自体が重い場合には有効ですが、用途は限定されます。


CC BY-SA 3.0
2015-12-29T06:26:57.990
20448
2015-12-29T06:26:57.990
9572
20216
answer