肥宅钓鱼网
当前位置: 首页 钓鱼百科

python工具方法和算法模型(胡渊鸣import一个太极)

时间:2023-07-14 作者: 小编 阅读量: 4 栏目名: 钓鱼百科

同样的结果只要0.363s,快了将近6倍。我们以经典教材《算法导论》中的经典动态规划案例“最长公共子序列问题”为例。反应-扩散方程,效果惊人自然界中,总有一些动物身上长着一些看起来无序但实则并非完全随机的花纹。图灵机的发明者艾伦·图灵是第一个提出模型来描述这种现象的人。拉普拉斯算子数值的计算需要访问相邻网格。而且和只能达到30fps左右的Numba实现比起来,Taichi实现由于可以选择GPU作为后端,轻松超过了300fps。

丰色 发自 凹非寺

量子位 | 公众号 QbitAI

众所周知,Python的简单和易读性是靠牺牲性能为代价的——

尤其是在计算密集的情况下,比如多重for循环。

不过现在,大佬胡渊鸣说了:

只需import 一个叫做“Taichi”的库,就可以把代码速度提升100倍

不信?

来看三个例子。

计算素数的个数,速度x120

第一个例子非常非常简单,求所有小于给定正整数N的素数。

标准答案如下:

我们将上面的代码保存,运行。

当N为100万时,需要2.235s得到结果:

现在,我们开始施魔法。

不用更改任何函数体,import“taichi”库,然后再加两个装饰器:

Bingo!同样的结果只要0.363s,快了将近6倍。

如果N=1000万,则只要0.8s;要知道,不加它可是55s,一下子又快了70倍

不止如此,我们还可以在ti.init()中加个参数变为ti.init(arch=ti.gpu) ,让taich在GPU上进行计算。

那么此时,计算所有小于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, b) = [0, 1, 4, 3, 1, 2]。

用动态规划的思路计算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 - 1],得到如下递归关系:

完整代码如下:

现在,我们用Taichi来加速:

结果如下:

胡渊鸣电脑上的程序最快做到了0.9秒内完成,而换成用NumPy来实现,则需要476秒,差异达到了超500倍!

最后,我们再来一个不一样的例子。

反应 - 扩散方程,效果惊人

自然界中,总有一些动物身上长着一些看起来无序但实则并非完全随机的花纹。

图灵机的发明者艾伦·图灵是第一个提出模型来描述这种现象的人。

在该模型中,两种化学物质(U和V)来模拟图案的生成。这两者之间的关系类似于猎物和捕食者,它们自行移动并有交互:

  1. 最初,U和V随机分布在一个域上;
  2. 在每个时间步,它们逐渐扩散到邻近空间;
  3. 当U和V相遇时,一部分U被V吞噬。因此,V的浓度增加;
  4. 为了避免U被V根除,我们在每个时间步添加一定百分比 (f) 的U并删除一定百分比 (k) 的V。

上面这个过程被概述为“反应-扩散方程”:

其中有四个关键参数:Du(U的扩散速度),Dv(V的扩散速度),f(feed的缩写,控制U的加入)和k(kill的缩写,控制V的去除)。

如果Taichi中实现这个方程,首先创建网格来表示域,用vec2表示每个网格中U, V的浓度值。

拉普拉斯算子数值的计算需要访问相邻网格。为了避免在同一循环中更新和读取数据,我们应该创建两个形状相同的网格W×H×2。

每次从一个网格访问数据时,我们将更新的数据写入另一个网格,然后切换下一个网格。那么数据结构设计就是这样:

一开始,我们将U在网格中的浓度设置为 1,并将V放置在50个随机选择的位置:

那么实际计算就可以用不到10行代码完成:

@ti.kerneldef compute(phase: int):for i, j in ti.ndrange(W, H):cen = uv[phase, i, j]lapl = uv[phase, i1, j]uv[phase, i, j1]uv[phase, i - 1, j]uv[phase, i, j - 1] - 4.0 * cendu = Du * lapl[0] - cen[0] * cen[1] * cen[1]feed * (1 - cen[0])dv = Dv * lapl[1]cen[0] * cen[1] * cen[1] - (feedkill) * cen[1]val = cen0.5 * tm.vec2(du, dv)uv[1 - phase, i, j] = val

在这里,我们使用整数相位(0或1)来控制我们从哪个网格读取数据。

最后一步就是根据V的浓度对结果进行染色,就可以得到这样一个效果惊人的图案

有趣的是,胡渊鸣介绍,即使V的初始浓度是随机设置的,但每次都可以得到相似的结果。

而且和只能达到30fps左右的Numba实现比起来,Taichi实现由于可以选择GPU作为后端,轻松超过了 300fps。

pip install即可安装

看完上面三个例子,你这下相信了吧?

其实,Taichi就是一个嵌入在Python中的DSL(动态脚本语言),它通过自己的编译器将被 @ti.kernel 装饰的函数编译到各种硬件上,包括CPU和GPU,然后进行高性能计算。

有了它,你无需再羡慕C/CUDA的性能。

正如其名,Taichi就出自太极图形胡渊鸣的团队,现在你只需要用pip install就能安装这个库,并与其他Python库进行交互,包括NumPy、Matplotlib和PyTorch等等。

当然,Taichi用起来和这些库以及其他加速方法有什么差别,胡渊鸣也给出了详细的优缺点对比,感兴趣的朋友可以戳下面的链接详细查看:

https://docs.taichi-lang.org/blog/accelerate-python-code-100x

— 完 —

量子位 QbitAI · 头条号签约

关注我们,第一时间获知前沿科技动态

    推荐阅读
  • 除夕年夜饭你吃的怎么样(组图又是一年除夕到)

    作为岁末的最后一晚,年夜饭无疑是当天的“重头戏”,虽然家家户户菜品各不相同,却都是团圆的象征。李享摄刚从外地回到家的吴先生夫妇,顾不上休息,就来到昆明篆新菜市场,准备除夕的年夜饭菜品。“我们昨晚刚到昆明,想着赶在年三十前回来,为家人准备一顿年夜饭。”昆明人家,那盆年菜最威武!网友供图吴先生告诉记者,他已经有一年时间没有回家了,平时跟家人主要靠视频电话联系。

  • 如何查微信被拉黑(4招教你知道是否被微信好友拉黑)

    群发使用群发这种功能很快就能查出来谁把你拉黑了,删除了,但是这种方式有点劳师动众,不够隐蔽,除非是过年发点祝福语言,不然为了查看谁删除了你专门去骚扰一遍所有人,还容易引起反感,下面我们就来说一说关于如何查微信被拉黑?如何查微信被拉黑群发。这种方式不动声色也很有效果,能大范围面积知道谁拉黑了你。

  • cdn加速原理(国内外优秀的CDN加速服务商)

    CDN是什么,其实CDN加速网站访问速度,提高网站服务器的运行效率,让用户更好的体验极速的访问体验。市面上好多CDN,比如360的网站安全卫士CDN加速,百度云CDN加速,阿里云CDN加速,七牛云的CDN加速,或者国外的incapsula免备案CDN加速,CloudFlare免备案CDN加速。全球CDN节点中只有一个节点。最重的要Incapsula提供的CDN节点有日本、香港、新加坡等亚太线路,非常适合国内的网站作加速访问,Incapsula节点最多的还是在美国,不少的节点其实连接国内也是不错的。

  • 早上励志的句子?早安(早安励志语录)

    ,我来为大家科普一下关于早上励志的句子早安?早上励志的句子早安每一个日出,总想带去希望的问候:让每天的空气都是清新让每天的心情都是舒展让每天的收获都是充实,早安!早安,新的一天。愿今后所有的担惊受怕,都是虚惊一场,所遇的天灾人祸,都能劫后余生,早。生活岂能百般如意,正因有了遗漏和缺憾,我们才会有所追寻。珍惜每一份拥有,拥抱每一份阳光,在你还有力气张开双臂的时候。

  • 微波炉奶瓶消毒正确方法 微波炉奶瓶消毒正确方法视频

    但千万不能将奶嘴和奶瓶盖放入微波炉消毒的,否则微波炉的高温会使其变形,以致损坏不能使用。

  • 如何有效的给客户介绍产品(不引起客户的渴望点)

    客户一旦对产品产生兴趣,他们就会主动接近并要求了解这种产品,并且他们的购买机率会很大。销售员首先就要把购买这款产品的好处告诉客户,是否打折促销、是否有相关赠品等等,从而引发客户的兴趣,增加客户进一步了解产品的愿望。这样,销售员不费吹灰之力就能与客户达成交易了。

  • 关于圣诞节爱情句子(描写圣诞节爱情句子)

    关于圣诞节爱情句子圣诞老爷爷您好,我把床暖好了,您可以把我喜欢的人塞我被窝里了,谢谢。圣诞节那天想要小跑一下,跑啊跑,跑进你心里,要是不行,圣诞老爷把你塞到我床上也可以。圣诞老人说,今年的圣诞愿望我不能实现了,我老了,背不动你了。偷偷许个愿,希望圣诞老人在圣诞节晚上把你送给我。我也想带上鹿角发卡拖上雪车蹭上圣诞老人的旅程呼哧呼哧跑到你面前,大大方方送你一份圣诞礼物。

  • mlxg评价rng(MLXG称RNG和EDG至少五五开)

    由于之前FPX击败了LGD,RNG已经确定晋级季后赛。在4月18日的比赛中,RNG迎来了季后赛最后一个对手SN!RNG被SN让一追二在前两局比赛中,RNG和SN互有来回,双方来到了关键的决胜局!但是,RNG依然凭借优势反推掉了对方中路高地!赛后,RNG的微博也再次被粉丝爆破!这把输了,对RNG的士气和季后赛状态的影响特别大。但是锅老师发表“这个版本领先经济被翻盘是菜”,“RNG打EDG至少是五五开”等评论引起了网友的热议。

  • 巴旦木亩产量一般多少斤,适合哪里种植

    巴旦木仁含油量很高,可用作精密仪器的防锈油,同时还可用作化妆品制造业及香料工业的生产原料等。巴旦木营养价值极高,富含脂肪、蛋白质、维生素、糖和氨基酸等成分,还含有钙、铜、锰、磷等微量元素。

  • 最简便的手表消磁方法(最简便的手表消磁该怎么做)

    最简便的手表消磁该怎么做找一块中间空心呈圆形的未受磁化影响的铁块,坚立于桌上,然后手表上的磁性就可以被铁块“吸”去,使手表恢复正常也可以花几十块钱购买一个消磁器,方便手表受磁时使用专业消磁,上磁是一种比较普遍的现象,解决方法。