Codon ist eine Hochleistungs-Python-Implementierung, die ohne Laufzeit-Overhead in nativen Maschinencode kompiliert. Typische Beschleunigungen über Vanille-Python liegen in der Größenordnung von 10 bis 100 x oder mehr auf einem einzelnen Faden. Die Leistung des Codons ist in der Regel mit (und manchmal besser als) der von C/C ++ entspricht (und manchmal besser als). Im Gegensatz zu Python unterstützt das Codon native Multithreading, was zu einer um ein Vielfaches noch höheren Beschleunigung führen kann.
Stellen Sie sich das Codon als Python vor, das für eine statische, vorausständige Zusammenstellung neu interpretiert wurde und die von Grund auf mit der bestmöglichen Leistung aufgebaut wurde.
Drop-In-Ersatz für CPYthon: Codon ist kein Drop-In-Ersatz für CPython. Es gibt einige Aspekte von Python, die nicht für die statische Zusammenstellung geeignet sind - wir unterstützen diese nicht im Codon. Es gibt Möglichkeiten, Codon in größeren Python -Codebasen über den JIT -Dekorateur oder die Python -Erweiterungs -Backend zu verwenden. Codon unterstützt auch das Aufrufen eines Python -Moduls über seine Python -Interoperabilität. Siehe auch "Unterschiede mit Python" in den Dokumenten.
Neue Syntax- und Sprachkonstrukte: Wir versuchen, so weit wie möglich neue Syntax, Schlüsselwörter oder andere Sprachfunktionen hinzuzufügen. Während Codon an einigen Stellen eine neue Syntax hinzufügt (z. B. um Parallelität auszudrücken), versuchen wir, es so vertraut und intuitiv wie möglich zu gestalten.
Vorgefertigte Binärdateien für Linux (x86_64) und macOS (x86_64 und ARM64) sind neben jeder Version erhältlich. Herunterladen und installieren mit:
/bin/bash -c " $( curl -fsSL https://exaloop.io/install.sh ) "
Oder Sie können aus der Quelle bauen.
Codon ist eine python-kompatible Sprache, und viele Python-Programme funktionieren mit wenigen Änderungen:
def fib ( n ):
a , b = 0 , 1
while a < n :
print ( a , end = ' ' )
a , b = b , a + b
print ()
fib ( 1000 )
Der codon
-Compiler verfügt über eine Reihe von Optionen und Modi:
# 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
Weitere Optionen und Beispiele finden Sie in den Dokumenten.
Sie können jedes Python -Paket aus dem Codon importieren und verwenden. Zum Beispiel:
from python import matplotlib . pyplot as plt
data = [ x ** 2 for x in range ( 10 )]
plt . plot ( data )
plt . show ()
(Denken Sie nur daran, die Variable der CODON_PYTHON
-Umgebungsvariable in der CPython Shared Library festzulegen, wie in den Dokumenten erläutert.)
In diesem Prime Counting -Beispiel wird die OpenMP -Unterstützung von Codon vorgestellt, die mit einer Zeile aktiviert ist. Die @par
-Annotation sagt dem Compiler, das Folgende for
-loop zu parallelisieren, in diesem Fall mit einem dynamischen Zeitplan, einer Streckgröße von 100 und 16 Threads.
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 unterstützt das Schreiben und Ausführen von GPU -Kerneln. Hier ist ein Beispiel, das den Mandelbrot -Satz berechnet:
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 )
Die GPU -Programmierung kann auch mit der @par
-Syntax mit @par(gpu=True)
durchgeführt werden.
Weitere Dokumentationen finden Sie in docs.exaloop.io.