compile関数ってどんなときに使うのですか?
まず、pythonはインタープリタ言語です。
インタープリタ言語はソースコードを1行ずつ実行します。
Bashなどのシェルスクリプト、PHPなどもインタプリタです。
CやJavaはコンパイラ言語です。
コンパイラによってソースコードは最適化され、CPUネイティブなバイトコードに変換され高速に実行します。
ソースコードのロジックやアルゴリズムが同等であれば、速度はコンパイラ言語が速いです。
ロジックやアルゴリズムが稚拙なCコードであれば、優れたインタプリタ言語のソースコードも、コンパイラ言語の速度に近づけることができができます。が、そんなに甘くはありません。
インタプリタ言語は速度は遅くとも、作る時間を短縮できる(といわれている)
コンパイラ言語は、速度は速くとも、構文難易度が高く、サクサク作ることができる人はそんなに多くない。
コンパイルすることのメリット
pythonのコンパイルには2種類あります。
1.ソースファイルをコンパイルする
ソースファイルを公開したくない場合、コンパイルによってバイトコードに変換したファイルを公開する。ということができます。
$ python -m compileall xxxxx.py
コンパイルを実行すると __pycache__
ディレクトリが作成され、.pyc
ファイルが生成されます。
このファイルは実行可能ファイルとなり、バイトコードに変換されていることにより、テキストエディタで読み理解することはできません。
2.実行が速くなる
処理速度は速くなりません。手続きが簡略化されソースの可読性は上がりますが、処理自体は未コンパイルと同じです。
3.ソースコード内に何度もできくる計算式・正規表現などをコンパイルしておき、使い回す
今回は「3」について深掘りしていきます。
compile()
を使わない普通のソース
#!/usr/local/env python3
import re
p = "<b>(.+)</b>" # パターン
s = "<div><b>hello</b></div>" # 検索対象文字列
m = re.search(p, s) # search()関数
print(m.group(1))
# hello;
compile()
を使った気の利いたソース
#!/usr/local/env python3
import re
p = "<b>(.+)</b>" # パターン
s = "<div><b>hello</b></div>" # 検索対象文字
reg = re.compile(p) # コンパイル
m = reg.search(s) # search()メソッド
print(m.group(1))
# hello;
同じパターンを何度も使い回す場合は、compile()
を使ったほうがよいです。速度というよりもソースの可読性のメリットが大きいです。
これにより多少の速度の改善は見込めますが、コンパイラ言語では、コンパイラによって自動的になされることではあります。