python 高性能编程 AOT VS JIT

python的动态性

def f(x,y):
    return x+y

print(f(1,2))
print(f("a","b"))

python具有动态性但实际较少用到,这给编译器的编译带来困难,编译时会进行选择跳转,导致动态语言很慢.

AOT 提前编译 ahead-of-time compilation

  • 在运行程序代码之前在单独的步骤中编译函数,生成可以独立分发的磁盘二进制对象。这是 C、C++ 或 Fortran 等语言中已知的传统编译类型。
  • 运行时没有编译开销。
  • AOT 编译为您的 CPU 架构系列(例如“x86-64”)生成通用代码,而 JIT 编译为您的特定 CPU 型号生成优化的代码

Cpython(将Cpython的代码编译为.so)

· 安装包

pip install Cpython

· 引入包

import cython

# 如官方的教程,编写Cpython的代码有两种方式,与传统python不同的是代码都有明显的类别标志
# 一是编写py文件 integrate_cy.py
def f(x: cython.double):
    return x ** 2 - x
def integrate_f(a: cython.double, b: cython.double, N: cython.int):
    i: cython.int
    s: cython.double
    dx: cython.double
    s = 0
    dx = (b - a) / N
    for i in range(N):
        s += f(a + i * dx)
    return s * dx
# 另一种是编写pyx文件 integrate_cy.pyx
def f(double x):
    return x ** 2 - x
def integrate_f(double a, double b, int N):
    cdef int i
    cdef double s
    cdef double dx
    s = 0
    dx = (b - a) / N
    for i in range(N):
        s += f(a + i * dx)
    return s * dx
# 更多参见链接
from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("example.pyx")
)

JIT 即时编译 Just In Time Compilation

  • 在程序运行时不断检测统计,进行编译
Layer 1 func f(x,y){ // f(1,y) cost 500us y+=x; if x%2 == 1{ while x>0{ return y; } x-=1; } } Partial Evaluation define new f f_old=f func f1(y){ return y+1; } // f1(y) cost 100us func f(x,y){ } x==1? return f1(y); return f_old(x,y); //cost 50us

PyPy

numba

  • 安装
pip install numba
  • 简单使用
from numba import jit
# 只需要添加一个装饰器
## 普通的方式
@jit(nopython=True)
def f(x): ...
## 强制类型的方式
@jit(["int32(int32)", "float32(float32)"], nopython=True)
def f(x): ...

jax(google出品的主要应用与及其学习)

from jax import jit

@jit
def f(x): ...
或者
高阶函数的方法
jitf = jit(f)

在使用是可以对程序中的重要部分抽取出来机型jit的单独优化,更多详细的使用见官方文档链接。

参考

具体实现可以参考 Python高性能((加)加布丽埃勒·拉纳诺著;袁国忠译):
pypy https://zhuanlan.zhihu.com/p/293154940

# AOT
[https://micropython.org/](https://micropython.org/)
[添加链接描述](http://www.360doc.com/content/21/0618/14/66515661_982600652.shtml)
[漫游深度学习编译器](https://zhuanlan.zhihu.com/p/410507557)
# JIT
[numba](https://numba.pydata.org/)
[numba doc](https://numba.pydata.org/numba-doc/dev/user/pycc.html)
[numba从入门到精通(1)—为什么numba能够加速](https://zhuanlan.zhihu.com/p/68720474)
[Pyjion is a drop-in JIT Compiler for Python 3.10. It can be pip installed into a CPython 3.10 installation on Linux, Mac OS X, or Windows.](https://www.trypyjion.com/)
【【编译原理】Python性能提升20倍的背后原理 - JIT做了什么事情-哔哩哔哩】 https://b23.tv/FOY3vaa
[Representation-based just-in-time specialization and the psyco prototype for python](https://www.semanticscholar.org/paper/Representation-based-just-in-time-specialization-Rigo/8ebddcd309160b5dfe302bd32139a8baca4ac8a2)
[添加链接描述](https://www.doc88.com/p-9925242953098.html)
[CS 6120 课程博客-动态语言的基于跟踪的即时类型专业化](https://www.cs.cornell.edu/courses/cs6120/2019fa/blog/tbjit-type-specialization/)
# pytorch 的jit
[PyTorch 的 1.0 版本发布的最核心的两个新特性就是 JIT 和 C++ API,这两个特性一起发布不是没有道理的,JIT 是 Python 和 C++ 的桥梁,我们可以使用 Python 训练模型,然后通过 JIT 将模型转为语言无关的模块,从而让 C++ 可以非常方便得调用,从此「使用 Python 训练模型,使用 C++ 将模型部署到生产环境」对 PyTorch 来说成为了一件很容易的事。而因为使用了 C++,我们现在几乎可以把 PyTorch 模型部署到任意平台和设备上:树莓派、iOS、Android 等等](https://zhuanlan.zhihu.com/p/370455320)
[我简单写了一个简单的 MNIST demo,从使用 Python 训练到用 JIT 将 Python 模型转换为 TorchScript Module,然后用 C++ 加载 TorchScript Module 做推断的完整的过程](https://github.com/louis-she/torchscript-mnist)
[pytorch JIT浅解析](https://blog.csdn.net/xxradon/article/details/86504906)

# 其它
## 反汇编模块dis
[python中dis的用法](https://www.jianshu.com/p/9553fa2c5c8b)

## Jython
[Jython:在java中写python](https://www.jython.org/)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值