Codon es una implementación de Python de alto rendimiento que se compila en el código de la máquina nativa sin ninguna sobrecarga de tiempo de ejecución. Las velocidades típicas sobre la pitón de vainilla están del orden de 10-100x o más, en un solo hilo. El rendimiento de Codon suele estar a la par (y a veces mejor que) el de C/C ++. A diferencia de Python, Codon admite múltiples lecturas nativas, lo que puede conducir a aceleraciones muchas veces más altas.
Piense en Codon como Python reinventado para la compilación estática y anticipada de tiempo, construida desde cero con el mejor rendimiento posible en mente.
Reemplazo de entrega para CPYTHON: Codon no es un reemplazo de entrega de CPython. Hay algunos aspectos de Python que no son adecuados para la compilación estática: no los apoyamos en Codon. Hay formas de usar Codon en bases de código Python más grandes a través de su decorador JIT o backend de extensión de Python. Codon también admite llamar a cualquier módulo de Python a través de su interoperabilidad de Python. Ver también "Diferencias con Python" en los documentos.
Nuevas construcciones de sintaxis y lenguaje: tratamos de evitar agregar una nueva sintaxis, palabras clave u otras características del lenguaje tanto como sea posible. Si bien Codon agrega una nueva sintaxis en un par de lugares (por ejemplo, para expresar el paralelismo), tratamos de hacerlo lo más familiar e intuitivo posible.
Los binarios previos a la construcción para Linux (x86_64) y macOS (x86_64 y ARM64) están disponibles junto con cada versión. Descargar e instalar con:
/bin/bash -c " $( curl -fsSL https://exaloop.io/install.sh ) "
O puede construir desde la fuente.
Codon es un lenguaje compatible con Python, y muchos programas de Python funcionarán con pocas o modificaciones:
def fib ( n ):
a , b = 0 , 1
while a < n :
print ( a , end = ' ' )
a , b = b , a + b
print ()
fib ( 1000 )
El compilador codon
tiene una serie de opciones y modos:
# 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
Vea los documentos para obtener más opciones y ejemplos.
Puede importar y usar cualquier paquete de Python desde Codon. Por ejemplo:
from python import matplotlib . pyplot as plt
data = [ x ** 2 for x in range ( 10 )]
plt . plot ( data )
plt . show ()
(Solo recuerde establecer la variable de entorno CODON_PYTHON
en la biblioteca compartida de CPyThon, como se explica en los documentos).
Este ejemplo de conteo principal muestra el soporte OpenMP de Codon, habilitado con la adición de una línea. La anotación @par
le dice al compilador que sea paralelice lo siguiente for
-loop, en este caso utilizando un horario dinámico, tamaño de fragmento de 100 y 16 hilos.
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 )
Codon admite escribir y ejecutar núcleos de GPU. Aquí hay un ejemplo que calcula el conjunto de 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 )
La programación de GPU también se puede realizar usando la sintaxis @par
con @par(gpu=True)
.
Consulte Docs.exaloop.io para obtener documentación en profundidad.