您现在的位置是:首页 >技术教程 >codon也将py程序加速了90倍了,C/C++调用codon网站首页技术教程

codon也将py程序加速了90倍了,C/C++调用codon

caridle 2023-05-10 22:30:03
简介codon也将py程序加速了90倍了,C/C++调用codon

我的苹果笔记本比较老旧了,2016款的Pro。

from time import time

def fib(n):
    return n if n < 2 else fib(n - 1) + fib(n - 2)

t0 = time()
ans = fib(40)
t1 = time()
print(f'Computed fib(40) = {ans} in {t1 - t0} seconds.')

运行起来,够意思的。

$ python fib.py
Computed fib(40) = 102334155 in 33.47038793563843 seconds.
$ codon run -release fib.py
Computed fib(40) = 102334155 in 0.370345 seconds.


codon run myprogram 

默认编译和运行模式为 debug ( -debug )。使用 -release 选项编译并运行优化:

codon run -release myprogram

还可以产生可执行文件:

codon build -exe fib.py

-rwxr-xr-x  1 xinnianwang  staff  116992 May  9 07:39 fib
-rw-r--r--  1 xinnianwang  staff     181 May  9 07:30 fib.py

$ ./fib
Computed fib(40) = 102334155 in 0.566732 seconds.

竟然比上面的慢了80%,不过能生成可执行文件,这个可不简单啊。文件有点大,117k了。

虽然Codon支持几乎所有的Python语法,但它不是一个直接的替代品,大型代码库可能需要修改才能通过Codon编译器运行。例如,Python的一些模块尚未在Codon中实现,并且不允许使用Python的一些动态功能。codon编译器生成详细的错误消息,以帮助识别和解决任何不兼容性。

codon还得升级来适配python。

但是这玩意到底有啥用?

不急,这里可以使用C/C++来调用python却是很方便的,所以一手C/C++一手python,天下我有。

使用 from C import 从 Codon 调用 C/C++ 非常容易,但也可以从 C/C++ 代码调用 Codon。要使codon函数在外部可见,只需使用 @export 对其进行注释:

@export
def foo(n: int):
    for i in range(n):
        print(i * i)
    return n * n

编译:odon build -o libfoo.so foo.codon

现在我们可以从 C 程序调用 foo
#include <stdint.h>
#include <stdio.h>
int64_t foo(int64_t);
int main() {
printf("%llu ", foo(10));
}
编译:
gcc -o foo -L. -lfoo foo.c

 $ ./foo
0
1
4
9
16
25
36
49
64
81
100

转换类型

Codon
C/C++
int
long or int64_t
float
double
bool
bool
byte
char or int8_t
str
{int64_t, char*} (length and data)
{int64_t, char*} (长度和数据)
class
Pointer to corresponding tuple 指向相应元组的指针
@tuple
Struct of fields 字段结构
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。