Кодон-это высокопроизводительная реализация Python, которая компилируется для нативного машинного кода без каких-либо накладных расходов во время выполнения. Типичные ускорения над ванильным питоном находятся по порядку 10-100x или более на одном потоке. Производительность кодона обычно находится наравне с (а иногда и лучше, чем) C/C ++. В отличие от Python, Codon поддерживает собственное многопоточное многопоточное, что может привести к ускорению во много раз выше.
Думайте о кодоне как о Python, переосмысленном для статического, наращенного компиляции, построенного с нуля с наилучшими возможными результатами.
Замена падения для CPYTHON: кодон не является заменой CPYTHON. Есть некоторые аспекты питона, которые не подходят для статического компиляции - мы не поддерживаем их в кодоне. Существуют способы использовать кодон в более крупных кодовых базах Python с помощью бэкэнда Extension Python Decorator или Python. Codon также поддерживает вызов любого модуля Python через совместимость с Python. См. Также «Различия с питоном» в документах.
Новые синтаксисы и языковые конструкции: мы стараемся как можно больше добавлять новый синтаксис, ключевые слова или другие языковые функции. В то время как Codon добавляет новый синтаксис в пару мест (например, для выражения параллелизма), мы стараемся сделать его максимально знакомым и интуитивно понятным.
Предварительно построенные двоичные файлы для Linux (x86_64) и macOS (x86_64 и ARM64) доступны вместе с каждым выпуском. Скачать и установить с:
/bin/bash -c " $( curl -fsSL https://exaloop.io/install.sh ) "
Или вы можете построить из источника.
Кодон-это совместимый с питоном языком, и многие программы 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 )
Кодон поддерживает написание и выполнение ядра графических процессоров. Вот пример, который вычисляет набор Мандельброта:
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 для подробной документации.