胡渊鸣:import 1个“太极拳库,Python代码提高100倍!-量子比特,
- 时间:
- 浏览:0
众所周知,Python的简单性和可读性是通过牺牲性能来牺牲的。
特别是在计算密集的情况下,例如多for循环。
但是现在,大人物胡渊鸣是这样说的。
我们来看三个例子。
计算素数的个数,速度x120的第一个例子很简单,都求小于给定的正整数N的素数。
标准答案如下。
如果N为100万,则需要2.235s才能获得结果:
不需要更改函数体。将以下两个加速器添加到import“taich”i库中:。
Bingo!同样的结果为0.363s,快了近6倍。
N=1000万的话0.8s,要知道,不加那个是55s,突然又快了70倍!
此外,还可以将ti.init()中加个参数更改为ti.init(arch=ti.gpu),在GPU上计算taich。
那么这个时候,计算不到1000万的素数只需要0.45s,与原来的Python代码相比速度提高了120倍!
厉害吗。
什么?你觉得这个例子太简单了,缺乏说服力吗。让我们看一些更复杂的东西。
动态规划、速度x500动态规划自不必说,作为优化算法,通过动态存储中间计算结果来减少计算时间。
以经典教材《算法导论》中的经典动态规划示例“最长公共子序列问题(LCS)”为例。
例如,对于序列a=[0、1、0、2、4、3、1、2、1]和序列b=[4、0、1、4、5、3、1、2],它们的LCS包括:
当使用动态规划的思想来计算LCS时,首先可以获得序列a的第一个i元素和序列b的第一个j元素的最长公共子序列的长度,然后逐渐增加i或j的值,重复过程并获得结果。
用f[i,j]表示该子序列的长度,即LCS(prefix(a,i),prefix(b,j)这里,prefix(a,i)是序列a的第一个i元素,即a[0]、a[1]、…、a[i#8211;1、,得到如下的递归关系:
完整代码包括:。
然后,使用taichi加速。
结果如下:。
胡渊鸣电脑上的程序最快在0.9秒内完成,NumPy实现需要476秒,差距超过500倍!
最后,我再举一个不同的例子。
反应#8211;扩散方程,惊人的效果在自然界中,有些动物看似无序但并非完全随机的花样。
图灵机的发明人阿兰图灵是第一个提出模型来描述这种现象的人。
在这个模型中,两种化学物质(U和V)模拟图案的生成。两者的关系类似于猎物和捕食者,自行移动相互作用:
首先,U和V随机分布在一个域中,在每个时间步长中,逐渐扩散到相邻空间。当U和V相遇时,U的一部分被V吞没。因此,为了避免V的浓度增加,U被V根除,我们在每个时间步长中添加一定比例(f)的U,删除一定比例(k)的V。此过程概述为“反应扩散方程”。
其中有四个重要参数:Du(U扩散速度)、Dv(V扩散速度)、f(feed缩写,控制U的加入)和k(kill缩写,控制V的去除)
当该方程在i中实现时,首先创建网格以表示区域,并且用vec2表示每个网格中U、V的浓度值。
计算运算符数值需要访问相邻网格。为了避免在同一周期内更新和读取数据,必须创建两个形状相同的网格W×H×2。
每次从一个网格访问数据时,将更新的数据写入另一个网格,然后切换到下一个网格。数据结构设计如下:。
最初,我们将网格中U的浓度设置为1,然后在随机选择的50个位置放置V。
实际计算可以用少于10行的代码进行。
@ti.kerneldef compute(phase:int):for i,j in ti.ndrange(W,H):cen=uv[phase,i,j]lapl=uv[phase,i+1,j]+uv[phase,i,j+1]+uv[phase,i,j+1]+uv[phase,i1,j]+uv[phase,i,j1]4.0*cen du=Du*lapl[0]cen[0]*cen[1]+feed*(1cen[0])0])dv=Dv*lapl[1]+cen[0]*cen[1](feed+kill)*cen[1](feed+kill)*cen[1]val=cen+0.5*tm.vec2控制。
最后一步是在V浓度的基础上对结果进行染色,可以获得如此惊人的效果。
有趣的是,胡渊鸣介绍了即使V的初始浓度被随机设定,每次也能得到同样的结果。
另外,与仅能达到30fps左右的Numba安装相比,taichi安装能够选择GPU作为后端,因此能够简单地超过300fps。
pip install可以安装上面的三个例子,你相信吗?
实际上,taichi是嵌入Python中的DSL(动态脚本语言),通过自己的编译器在包括CPU和GPU在内的各种硬件上编译由@ti.kernel装饰的函数,进行高性能计算。
有了它,你就不用羡慕C++/CUDA的性能啦。
顾名思义,taichi来自太极图形胡渊鸣的团队,现在只需pip install就可以安装这个库,与NumPy、Matplotlib、PyTorch等其他Python库进行交互。
当然,taichi与这些程序库和其他加速方法有什么不同,胡渊鸣还提供了详细的优缺点比较,有兴趣的人可以点击下面的链接详细查看:
https://docs.taichi-lang.org/blog/accelerate-python-code-100x