密码子是一个高性能的Python实现,它将编译到本机机器代码没有任何运行时开销。一条线程上的典型加速度的python的典型加速度为10-100倍或以上。密码子的性能通常与C/C ++的性能相当(有时比)。与Python不同,密码子支持本机多线程,这可能会导致更高的加速。
将密码子视为Python重新构想,以提前汇编,从头开始构建,考虑到最佳性能。
CPYTHON的倒入替换:密码子不是CPYTHON的倒入替换。 Python的某些方面不适合静态汇编 - 我们不支持密码子。有多种方法可以通过其JIT装饰器或Python扩展后端在较大的Python代码库中使用密码子。密码子还支持通过其Python互操作性调用任何Python模块。另请参见文档中的“与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支持,并添加了一行。 @par
注释告诉编译器,在这种情况下,使用动态时间表,块大小为100和16个线程,并并行化以下for
。
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
语法完成。
请参阅docs.exaloop.io以获取深入文档。