Codon هو تطبيق Python عالي الأداء يتجمع إلى رمز الجهاز الأصلي دون أي وقت تشغيل. تتراوح السرعات النموذجية على فانيليا بيثون من 10-100x أو أكثر ، على موضوع واحد. عادةً ما يكون أداء الكودون على قدم المساواة مع (وأحيانًا أفضل من) أداء C/C ++. على عكس Python ، يدعم Codon Multithreading الأصلي ، والتي يمكن أن تؤدي إلى تسرع عدة مرات.
فكر في الكودون كما يعيد تصور Python لتجميع ثابت ، قبل الوقت ، مبني من الألف إلى الياء مع أفضل أداء ممكن في الاعتبار.
استبدال القفل لـ Cpython: الكود ليس بديلاً عن Cpython. هناك بعض جوانب Python غير مناسبة لتجميع ثابت - نحن لا ندعم هذه في الكودون. هناك طرق لاستخدام الكودون في Bython Codebases أكبر عبر Jit Decorator أو Python Extension الخلفية. يدعم Codon أيضًا استدعاء أي وحدة Python عبر قابلية التشغيل البيني للبيثون. انظر أيضًا "الاختلافات مع بيثون" في المستندات.
بناء الجملة الجديد والبنيات اللغوية: نحاول تجنب إضافة بناء جملة جديد أو كلمات رئيسية أو ميزات لغة أخرى قدر الإمكان. على الرغم من أن الكودون يضيف بعض بناء الجملة الجديد في مكانين (على سبيل المثال للتعبير عن التوازي) ، نحاول أن نجعله مألوفًا وبديهية قدر الإمكان.
تتوفر الثنائيات التي تم تصميمها مسبقًا لـ Linux (x86_64) و MacOS (x86_64 و ARM64) جنبًا إلى جنب مع كل إصدار. تنزيل وتثبيت مع:
/bin/bash -c " $( curl -fsSL https://exaloop.io/install.sh ) "
أو يمكنك البناء من المصدر.
الكودون هي لغة متوافقة مع 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
انظر المستندات لمزيد من الخيارات والأمثلة.
يمكنك استيراد واستخدام أي حزمة Python من الكود. على سبيل المثال:
from python import matplotlib . pyplot as plt
data = [ x ** 2 for x in range ( 10 )]
plt . plot ( data )
plt . show ()
(فقط تذكر تعيين متغير بيئة CODON_PYTHON
على مكتبة Cpython المشتركة ، كما هو موضح في المستندات.)
يعرض مثال العد الرئيسي هذا دعم OpenMP الخاص بـ Codon ، والذي تم تمكينه مع إضافة سطر واحد. يخبر التعليق التوضيحي @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
مع @par(gpu=True)
.
يرجى الاطلاع على docs.exaloop.io للحصول على وثائق متعمقة.