Codon 是一款高性能的 Python 编译器,它可以将 Python 代码编译成本地机器代码,不会产生任何运行时开销。通常情况下,相对于 Python,单线程的速度提升可以达到 100 倍或更多,Codon 支持本地多线程,这可能会极大的提升执行速度。
Quick Start
from time import time
def fib(n):
return n if n < 2 else fib(n - 1) + fib(n - 2)
t0 = time()
ans = fib(36)
t1 = time()
print(f'Computed fib(36) = {ans} in {t1 - t0} seconds.')
效果所见即所得
提升特定函数性能
手里现有 Python 项目重构或适配 Condon 不现实,可以使用 Condon 提供的装饰器加速特定函数,提升性能。
$ pip3 install codon-jit
示例代码
import codon
from time import time
def is_prime_python(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
@codon.jit
def is_prime_codon(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
t0 = time()
ans = sum(1 for i in range(100000, 110000) if is_prime_python(i))
t1 = time()
print(f'[python] {ans} | took {t1 - t0} seconds')
t0 = time()
ans = sum(1 for i in range(100000, 110000) if is_prime_codon(i))
t1 = time()
print(f'[codon] {ans} | took {t1 - t0} seconds')
使用三方模块示例
我写了个 requests 请求本机 IP 的脚本,用来测试
import requests
headers = {
'User-Agent': 'curl/7.68.0',
'Accept': '*/*'
}
response = requests.get('http://ip.sb', headers=headers)
ip_address = response.text.strip()
print("local ip address: " + ip_address)
直接执行:codon run ip.py
会抛出报错
查看文档后可以从 python 模块中导入模块使用
将 import requests
替换为 from python import requests
再次执行,再次报错
查阅 Issue 及文档,原来需要设置一个环境变量
# ubuntu
export CODON_PYTHON=/usr/lib/x86_64-linux-gnu/libpython3.10.so
# centos
export CODON_PYTHON=/usr/lib64/libpython3.6m.so
再次运行,正确输出
另外编写 codon 代码时,如需引用 python 的函数,可以使用 @python
装饰器。具体的使用参考 Python integration #@python
from python import
@python
以上两种方式可以使用已存在的 Python 代码及模块,C/C++ 集成参考 C/C++ integration
关于 Build 可行性文件
不同于 golang 编译好的二进制程序可哪运行,Codon 编译后的可执行文件分发尚有问题。
二进制程序中对动态库的引用都是本地的,分发到另外的机器就不能用了。
这个 Issue(#82)讨论了打包问题,目前还没有比较好的方案解决。
尽管如此,构建的二进制文件某些场景仍有意义,如避免源代码泄露、防止代码被修改等。
Codon 的文档
Codon 可以执行绝大部分的 Python 原生代码,Codon 也有着自己的语法,更多的差异与特性,参考官方文档:
- 常见问题解答:Frequently asked questions
- 与 Python 的差异:Differences with Python
- Codon 基础语法:Codon Basics
总结
能用 Codon 做什么?可以改造老 Python 项目中性能较差的函数,很小的改动就可以极大的提升性能。
也可以在写 Pyhton 脚本时,不用担心 Python 的性能问题,用 Python 的语法,拥有 C 的性能,另外 Codon 充分考虑到可扩展性,使用第三方包也很方便,毕竟 Python 的生态比语法简单更为重要。
我简单看了 Coton 文档,对于 Coton 的最终目标不了解,但从 Case 来看,可以对 Codon 有所期待~