Python入門 compile関数ってどんなときに使うのですか?

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()を使ったほうがよいです。速度というよりもソースの可読性のメリットが大きいです。
これにより多少の速度の改善は見込めますが、コンパイラ言語では、コンパイラによって自動的になされることではあります。

書籍の紹介

Python入門 `next()`関数はどんなときに使うのですか

Python入門 `next()`関数はどんなときに使うのですか

Python入門 特殊文字を削除したいのですが?

Python入門 特殊文字を削除したいのですが?