Codonは、ランタイムオーバーヘッドなしでネイティブマシンコードにコンパイルする高性能Python実装です。 Vanilla Python上の典型的なスピードアップは、単一のスレッドで10〜100倍以上のオーダーにあります。コドンのパフォーマンスは、通常、C/C ++と同等です(そして時にはそれよりも優れています)。 Pythonとは異なり、Codonはネイティブのマルチスレッドをサポートしています。
コドンは、可能な限り最高のパフォーマンスを念頭に置いて、ゼロから構築された静的で先行コンピレーションのために再考されたPythonと考えてください。
Cpythonのドロップイン交換: CodonはCpythonのドロップイン代替品ではありません。静的コンパイルには適していないPythonにはいくつかの側面があります。コドンではこれらをサポートしていません。 JITデコレータまたはPython拡張機能バックエンドを介して、より大きなPythonコードベースでコドンを使用する方法があります。 Codonは、Pythonの相互運用性を介してPythonモジュールの呼び出しもサポートしています。ドキュメントの「Pythonの違い」も参照してください。
新しい構文と言語構成:新しい構文、キーワード、またはその他の言語機能の追加を可能な限り追加しないようにします。コドンはいくつかの場所にいくつかの新しい構文を追加しますが(例えば、並列性を表現するために)、できるだけ馴染みのある直感的にしようとします。
Linux(x86_64)およびMacOS(x86_64およびARM64)の事前に構築されたバイナリは、各リリースと一緒に利用できます。ダウンロードしてインストール:
/bin/bash -c " $( curl -fsSL https://exaloop.io/install.sh ) "
または、ソースから構築することができます。
CodonはPython互換の言語であり、多くのPythonプログラムは、変更があればほとんど機能しません。
def fib ( n ):
a , b = 0 , 1
while a < n :
print ( a , end = ' ' )
a , b = b , a + b
print ()
fib ( 1000 )
codon
コンパイラには、多くのオプションとモードがあります。
# compile and run the program
codon run fib.py
# 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
# compile and run the program with optimizations enabled
codon run -release fib.py
# 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
# compile to executable with optimizations enabled
codon build -release -exe fib.py
./fib
# 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
# compile to LLVM IR file with optimizations enabled
codon build -release -llvm fib.py
# outputs file fib.ll
より多くのオプションと例については、ドキュメントを参照してください。
CodonからPythonパッケージをインポートして使用できます。例えば:
from python import matplotlib . pyplot as plt
data = [ x ** 2 for x in range ( 10 )]
plt . plot ( data )
plt . show ()
(ドキュメントで説明されているように、 CODON_PYTHON
環境変数をCpython共有ライブラリに設定することを忘れないでください。)
この主要なカウントの例は、1つのラインの追加で有効になっているコドンのOpenMPサポートを紹介します。 @par
アノテーションは、コンパイラに、次のようfor
-Loopの以下を並列化するように指示します。この場合、ダイナミックスケジュール、100のチャンクサイズ、16個のスレッドを使用します。
from sys import argv
def is_prime ( n ):
factors = 0
for i in range ( 2 , n ):
if n % i == 0 :
factors += 1
return factors == 0
limit = int ( argv [ 1 ])
total = 0
@ par ( schedule = 'dynamic' , chunk_size = 100 , num_threads = 16 )
for i in range ( 2 , limit ):
if is_prime ( i ):
total += 1
print ( total )
コドンは、GPUカーネルの書き込みと実行をサポートしています。 Mandelbrotセットを計算する例は次のとおりです。
import gpu
MAX = 1000 # maximum Mandelbrot iterations
N = 4096 # width and height of image
pixels = [ 0 for _ in range ( N * N )]
def scale ( x , a , b ):
return a + ( x / N ) * ( b - a )
@ gpu . kernel
def mandelbrot ( pixels ):
idx = ( gpu . block . x * gpu . block . dim . x ) + gpu . thread . x
i , j = divmod ( idx , N )
c = complex ( scale ( j , - 2.00 , 0.47 ), scale ( i , - 1.12 , 1.12 ))
z = 0j
iteration = 0
while abs ( z ) <= 2 and iteration < MAX :
z = z ** 2 + c
iteration += 1
pixels [ idx ] = int ( 255 * iteration / MAX )
mandelbrot ( pixels , grid = ( N * N ) // 1024 , block = 1024 )
GPUプログラミングは@par(gpu=True)
を使用して@par
Syntaxを使用して実行できます。
詳細なドキュメントについては、docs.exaloop.ioを参照してください。