今回はPythonの実装を
めちゃくちゃ高速化出来るという
めちゃくちゃ高速化出来るという
codonライブラリを試してみました
解説動画はこちら
このcodonライブラリですが
C/C++に匹敵する実行速度を実現出来るという
コンパイラです
Pythonのライブラリだと他にも
PyPy
Cpython
Numba
などのコンパイル型
高速化ライブラリが存在しますが
それを超える速度を出せるとか・・・
一応の制約として
標準ライブラリ以外は
含める事ができない制約があるようです
こちらにコードがあります
codon
今回はGoogle Colabで
検証してみたいと思います
Google Colab上へのインストール
%%bash /bin/bash -c "$(curl -fsSL https://exaloop.io/install.sh)"
まずはライブラリをインストールしないと
動かないのでこれでコマンド等をインストールします
インストール後はcodonコマンドが使えます
実行の仕方
1.Pythonの実装ファイルを作成する「.py」
2.Google Colabのファイル置き場に置く
3.codonコマンドでコンパイルしながら実行
codon run ファイル名
これでコンパイルしながら実行されます
4.実行用のファイルをコンパイルする
codon build -release -exe ファイル名コンパイルしたファイルの実行
./ファイル名
これらでPython実装からcodonで
実行が行えます
素数判定のプログラムで検証
まずは素数の判定に使われるプログラムで
時間を計測してみます
prime.pyというファイルにして
ファイルを配置します
# Pythonでの実装
from sys import argv
from time import time
def is_prime(n):
factors = 0
for i in range(2, n):
if n % i == 0:
factors += 1
return factors == 0
limit = int(10000)
total = 0
t0 = time()
for i in range(2, limit):
if is_prime(i):
total += 1
t1 = time()
print(total)
print(t1 - t0)1229
2.6382787227630615
Pythonでの実装は2.63秒ほどでした
codonでコンパイルしながら実行します
!/root/.codon/bin/codon run /content/prime.py1229
0.112064
20倍ほどは早くなっていますね
アッカーマン関数での比較
次はアッカーマン関数で比較です
この関数は非負整数 m と n で
定義される関数のことで
与える数が大きくなると
爆発的に計算量が大きくなり
爆発的に計算量が大きくなり
性能測定などに用いられるようです
このプログラムを使用しました
再帰を伴うので、上限を開放しておかないと
動かない様です
# pythonによる実装
import time
import sys
#再帰回数の上限を開放
sys.setrecursionlimit(100000)
def ackermann(m: int, n: int) -> int:
if m == 0:
return n + 1
elif n == 0:
return ackermann(m - 1, 1)
else:
return ackermann(m - 1, ackermann(m, n - 1))
m, n = 3, 10
start = time.time()
result = ackermann(m, n)
end = time.time()
print(f"ackermann({m}, {n}) = {result}")
print(f"elapsed time: {int((end - start) * 1000)} [ms]")ackermann(3, 10) = 8189
elapsed time: 7522 [ms]
codon版は再帰の回数を少し増やしています
!/root/.codon/bin/codon run /content/coden.pyackermann(3, 11) = 16381
elapsed time: 847 [ms]
最適化してコンパイルしておいたものを
実行してみると
!/root/.codon/bin/codon build -release -exe /content/coden.py !/content/codenackermann(3, 11) = 16381
elapsed time: 185 [ms]
同じ回数ではないですが
再帰回数が2倍に増えていても
実行時間は50倍ほどは速そうです
ベンチマークによると
100倍ほど早くなるそうで
簡単なアルゴリズムなんだけど
実行回数が多いとか
時間がかかる部分を大幅に短縮出来ますね
pure python が輝ける日が来るかもしれません
今回はPython実装を高速化させる
codon について紹介しました
今回はここまでです
それでは

コメントする