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

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 · 头条号签约

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

    推荐阅读
  • 榨菜怎么下饭好吃(喜欢吃榨菜不用出去买)

    今天为大家分享一个好吃的榨菜做法,喜欢吃榨菜的朋友呢,不用再出去买吧,教您在家制作干净又卫生好吃又简单,我们一起看看吧!首先把苤蓝清洗干净,用刀把它的外皮削掉,然后切成薄片再切成榨菜丝。切好的榨菜丝,我们放在一个大盘中,撒上多一点的食用盐,用手抓匀腌制一下其中多余的水分。锅中倒上多一点的醋,加上一把花椒大料。加入一勺食用盐,煮开以后淋在榨菜丝上面。

  • 管理会计的方法包括(管理会计的方法介绍)

    管理会计的方法包括边际分析法它是增量分析的一种形式。由自变量的微量变化所形成的函数的精确变化率,就是边际的概念,在数学上用导数来表现。边际分析的最大特点,是可用来作为确定生产经营最优化目标的重要工具。它联系成本与产量的增减动态进行差量分析,是构成基础性管理会计的一项重要内容。这是企业用来进行长期投资决策方案经济评价的基本方法。

  • 枕头芯脏了该怎么清洗(枕头芯脏了该怎么清洗需要出棉花吗)

    洗后烘干甩干即可。漂洗时可在温水中加入4-5盖子白醋,减少残存碱性洗涤液对羽绒的损害。洗完后再用双手将水分挤出,不要拧得太干,在阴凉处晾干后,轻轻拍打枕芯即可。洗后用干布吸水,放置在阴凉处风干,切勿在太阳下暴晒,以免材料氧化变质。

  • 拳皇安琪儿为什么那么重(拳皇安琪儿体重了解)

    之所以说她重量级,是因为这位女性角色一改玩家们对美女的认知,一度传言安琪儿吨位高达300斤。最令人匪夷所思的是,SNK官方对安琪儿的战斗服设计,这羞耻程度远超全民女神不知火舞。安琪儿的改造部位则是她的肌肉密度,因为安琪儿的肌肉密度经过了高强度的压缩,所以她的体重超标是有依据的。

  • 凤囚凰为什么分两部分(楚玉穿越)

    凤囚凰为什么分两部分?接下来我们就一起去了解一下吧!凤囚凰为什么分两部分凤囚凰分两部分,是两个故事,是分了两个国家,类似于小故事一类的,先是宋朝时代,再到魏国,就一个国家一个新的故事,但是又是连起来的,故事情节和原著差别是很大的。是有关联的,在大魏女主受她弟宠,后来她弟死了,没人能护她了,人家都想让她死,她跑到大宋了,容止是大宋的摄政王,太后的亲兄弟。

  • 柚子怎么挑选(柚子挑选的几个小妙招)

    柚子怎么挑选挑柚子的时候,第一个看的不是柚子的形状,而是皮,通过柚子皮可以判断柚子的新鲜度,挑选柚子的时候,尽量挑那种表皮比较新鲜光滑的,如果柚子皮是邹巴巴的就不要再买了,因为这就说明,这些柚子已经放了很多甜了,水分几乎已经没有了。在挑选柚子的时候,最好挑选圆头的,毕竟尖头的地方是柚子的果蒂,这个地方是没有果肉的,如果是圆的,果皮就会比较少,果肉也比较多。

  • 2022四六级成绩查询官网入口 2022四六级成绩查询官网入口河南

    从2005年开始,大学四六级考试成绩采用了满分710分的计分体制,不设及格线,成绩告知方式由考试合格证书改为成绩报告单,内容包括:总分、单项分等。一般认为四六级成绩大于或等于425,即为通过考试。温馨提示:1.若考生的口试成绩为D等,则成绩报告单上不报道其口试成绩。

  • 美国留学专业最好的大学(美国本科留学各州最好的保底大学)

    接下来我们就一起去了解一下吧!美国留学专业最好的大学很多时候,我们认为“不的好大学=录取率高”,但下面这些大学用数字推翻了这个概念,这些大学录取率高,但学术质量也不含糊,是不错的保底之选!那么,美国本科留学各州最好的保底大学都有哪些?

  • 什么多肉最贵长大最好看又可爱(价值高达数万元)

    白皮月界价格贵的原因不仅是它生长的缓慢,而且白皮月界的繁殖还非常困难,物以稀为贵,所以白皮月界的价格自然就要比我们在市面上见到的普通多肉价格要贵4、万象锦万象锦的叶片分散排列开,但是因为质地晶莹剔透,看起来十分美观。万象锦这种多肉是没有茎的,直接生长在泥土中,呈半圆形。现在市面上最罕见的万象锦颜色是黄色的,差不多能卖到3万块左右。

  • 书房内不可缺少的家具有哪些 书房里都有什么家具

    书房顾名思义就是指阅读、学习、研究以及工作的空间,它是办公场所的延伸,也是家庭生活中的一部分。书房可算得上是一个家庭中非常重要的功能区域,而书房内的家具往往决定了整体的品味,所以在进行挑选书房家具的时候一定要综合考虑。目前,市面上的书桌材质和款式有很多,可以满足不同的书房使用。若是选择单独搭配的话,建议不要选择太硬的椅子。