三三文章网 - 科技知识大全是专业科技新媒体网站。网站著眼于新一代科技新闻的全面及时处理报导,让网民在外面第二时间交待全球新一代的科技资讯。内容涵括AI+、互联网、IT、创业投资、核定、区块链、智能硬件等领域

胡渊鸣: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