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

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

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

同样的结果只要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 · 头条号签约

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

    推荐阅读
  • 柴油车尾气不达标怎么办(用以下方法简单判断和修复)

    柴油车尾气不达标怎么办常规检查部分:汽缸磨损度、喷油嘴偶件卡滞、供油时间变化、气门间隙、空气滤清器。对照检查部分出现的问题及时调整与修复,经修复后的柴油车,其性能指标理应达到规定的技术要求,包括应达到规定的动力性、经济性及排放烟度指标。应该考虑汽缸的喷油量是否够,可能是积碳造成喷油嘴部分堵塞或调整不当。轮边功率合格、排放超标3倍以上进气量不够燃烧恶化,喷油嘴或汽缸中度磨损或积碳。适当调整喷油泵。

  • 去皮马蹄是什么 去皮马蹄是什么东西

    对于煮过的马蹄并没有煮熟的,可以直接清水中浸泡后用刀去皮。分布于中国、日本、琉球群岛、南洋岛和印度。是中国特色蔬菜之一,通常食用地下膨大球茎,可生食、熟食或做菜,尤适于制作罐头,被称为清水马蹄。还可提取淀粉,与藕粉、菱粉并称为淀粉三魁。

  • 空降副店长黛西扮演者(她还演过这个电视剧)

    空降副店长黛西扮演者副店长黛西的扮演者也成为了一大焦点,这个黛西其实是由田依桐扮演的。出道以来,田依桐分别出演了《初遇在光年之外》、《天意之秦天宝鉴》、《我的奇妙男友2》、《不可思议的晴朗》、《月上重火》等影视剧,获得了不少关注。黛西是很嚣张的一个人,从她刚进门的那一刻就一直在针对王漫妮。副店长的小心思很明显,她就是想要让王漫妮出丑,让王漫妮犯错误,这样才能赶走王漫妮。

  • 保存干花的方法(如何将干花保存的更长久?)

    暂时没有使用的干花要用纸箱装好,放在通风处,箱底要垫高,离地面要有10cm以上,并且要经常检查,定期翻晒。尤其是霉雨季节更要注意防潮。防退色干花要注意保持染后颜色,即原有的设计颜色。阳光的照射是产生退色的主要原因。因此,在摆放干花时,应尽量避开过强的光照。需要注意的是,上述清除灰尘的方法都可能引起干燥花观赏品质下降,应谨慎使用。

  • 鸡大肠杆菌怎样治疗能治好(蛋鸡大肠杆菌病的诊断与治疗)

    蛋鸡大肠杆菌病是由致病性大肠埃希氏杆菌所引起的多各病症的总称,可引起胚胎和雏鸡死亡的重要原因之一。因此正确诊断有助于用药治疗,降低死亡率,减少禽场经济损伤。蛋鸡大肠杆菌病是鸡养殖场中常见的鸡疾病,具有多发性,是由大肠杆菌引发的鸡肠道疾病。蛋鸡自身抵抗力较弱,患有大肠杆菌病常会伴有继发性局部感染或者全身感染。

  • 如何用洗衣机洗衣服正确步骤(衣服用洗衣机洗)

    轻松清洗洗衣机,其实只需要两样材料,那就是白醋和小苏打。大家都知道白醋和小苏打是日常清洁的好帮手,不过这两样搭配起来用在洗衣机清洁上,我们完全不用动手拆卸洗衣机内筒,只要两步就能轻轻松松地把洗衣机清洗干净,非常简单方便。第二步倒入小苏打溶液运转5分钟静置2小时先把50克小苏打溶解在500毫升的水中,再将洗衣机加满水倒入小苏打溶液。

  • 海尔洗衣机洗衣液放哪个格子(海尔洗衣机说明书)

    海尔洗衣机说明书可以让人们在使用洗衣机的时候减少许多不必要的麻烦,避免因为不正确的洗衣机使用方法而导致的海尔洗衣机的寿命缩短。海尔洗衣机说明书教您使用方法1、海尔洗衣机使用首先要连接好电源,保证家中的电源线路安装漏保和接地,以免发生严重的触电事故,安装好自动水龙头,保证地面平稳。先启动海尔洗衣机的电源按钮,让洗衣机可以接受控制。

  • 吃榴莲有哪些功效和注意点(盘点榴莲的五大功效)

    榴莲的营养价值很高,被人们誉为“果中之王”,其丰富的营养对机体有很好的补养作用,是良好的果品类营养来源。榴莲对人体有很多的功能和作用。病后及妇女产后可用之来补养身体。这种馥郁的气味造就了榴莲的一大功效,就是开胃、促进食欲。因为榴莲是热性水果,因此食用后可以起到活血散寒、缓解经痛的作用,特别适合体寒痛经怕冷的女性吃。钾参与蛋白质、碳水化合物和能量的代谢及物质转运,有助于预防和治疗高血压。

  • 微信群里怎么发起投票(微信群里怎么发起投票活动)

    2、打开小程序的搜索功能,在搜索输入框中输入关键词“腾讯投票”,就可以查看到搜索结果。

  • 丁丁来丁丢(丁丁也会躲起来哟)

    手术年龄应在学龄前后为宜,既可避免隐匿性阴茎产生的不良生理和心理影响,也更有利于手术操作和术后恢复。患儿及家长要有信心,隐匿性阴茎只是一种外生殖器畸形,大部分治愈后外观接近正常男性。当然,通过隐匿性阴茎手术改善阴茎外观,是消除患儿心理负担的最好方法。