使用 Codon 提升 Python 代码执行速度

Published: 2023-03-22

Tags: Python

本文总阅读量

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 也有着自己的语法,更多的差异与特性,参考官方文档:

总结

能用 Codon 做什么?可以改造老 Python 项目中性能较差的函数,很小的改动就可以极大的提升性能。

也可以在写 Pyhton 脚本时,不用担心 Python 的性能问题,用 Python 的语法,拥有 C 的性能,另外 Codon 充分考虑到可扩展性,使用第三方包也很方便,毕竟 Python 的生态比语法简单更为重要。

我简单看了 Coton 文档,对于 Coton 的最终目标不了解,但从 Case 来看,可以对 Codon 有所期待~

参考