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

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

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

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

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

    推荐阅读
  • 凉拌白菜心的家常做法(怎么做凉拌白菜心)

    主料:白菜心1棵、香菜2棵辅料:盐适量、油适量、辣椒1个、大蒜1瓣、醋适量、鸡精适量,接下来我们就来聊聊关于凉拌白菜心的家常做法?以下内容大家不妨参考一二希望能帮到您!凉拌白菜心的家常做法主料:白菜心1棵、香菜2棵。将盐、油、醋和蒜末混合加入白菜丝中拌匀。锅中加点油烧热,放入椒丝稍炸。

  • 脚气鞋子怎么彻底消毒(脚气鞋子如何消毒杀菌)

    脚气鞋子怎么彻底消毒要勤换鞋子,鞋内尽量的保持干燥,这样的话能减少真菌存在的机会。患者除了鞋袜要进行杀菌消毒之外,自己的脚气也要积极的治疗,真菌感染具有传染性,脚气治疗不及时,还会传染到指甲,形成灰指甲,甚至累及身体其他部位,如躯干四肢,在女性甚至会导致真菌性阴道炎的发生,还容易传染给孩子,使孩子得脚气、灰指甲、甚至体癣。

  • 金匮肾气丸的功效与作用及禁忌(金匮肾气丸的功效与作用及禁忌(是什么)

    接下来我们就一起去了解一下吧!金匮肾气丸的功效与作用及禁忌金匮肾气丸是由六味地黄丸加附子和肉桂组方,其主要成分包括地黄、山药、茯苓、泽泻、桂枝、牛膝、山茱萸、车前子、附子、肉桂等。主要功效为温阳补肾或治疗阴阳两亏。可用于腰痛腿软者,或下半身常有冷感、少腹拘急、小便不利者。临床上常用于慢性肾炎、肾病综合征、肾功能不全、精子缺乏症、高血压、糖尿病等的治疗。在服药期间禁忌食生冷食物,忌房事。

  • 商洛市公租房申请方式 洛阳市公租房申请流程

    》》》》》商洛本地宝为您整理了更多关于商洛公租房申请及商洛公租房补贴等相关信息,详情请查看本地宝商洛公租房指南。

  • 长善救失什么意思(长善救失的释义)

    下面内容希望能帮助到你,我们来一起看看吧!长善救失什么意思长善救失的释义:要善于发现学生的长处,并且能引导学生纠正自己的失误过错。长善救失在《学记》中所要表达的就是要求教师懂得教育的辩证法,坚持正面教育,掌握心理差异,善于因势利导,利用积极因素克服消极因素,将缺点转化为优点。在教育教学实践中,正确理解并有效运用辩证法思想去处理教学实践中的各种情形,这才是“长善救失”的真正内涵。

  • 温州一家人电视剧哪年的(解码温州家人系列电视剧现象)

    温州以商起家、以商闻名,是中国改革开放先行地、民营经济重要发祥地。至此,中国电视剧史上诞生出了“温州家人”系列电视剧现象,该系列电视剧以温州为缩影,折射出中国40多年改革开放和现代化建设的宏大历史进程。据悉,“温州家人”系列电视剧先后在法国、韩国、哈萨克斯坦、巴拿马、古巴等“一带一路”沿线国家和中国台湾地区热播。胡剑谨表示,这种独特现象起源于对外开放的时代背景。

  • 孕妇可饮用的茶(茶孕妇能喝吗)

    当今更作为公认的保健饮品广泛流行于世界。茶叶的营养成分包括蛋白质、脂类、碳水化合物、多种维生素和矿物质。茶叶中含有咖啡碱,因此临睡前不宜饮浓茶,而容易失眠的人则不宜饮茶。患胃溃疡的人不宜饮茶。茶叶中含有茶碱和鞣酸吗,因此营养不良的人不宜饮茶,因这两种成分会影响人体对于蛋白质及矿物质的吸收,如对缺铁性贫血的人不宜喝茶。

  • 吸渣体质的女孩特点(吸渣体质的女人)

    最近热播的《小敏家》里的刘小捷这个人设,就是一个典型。从后期预告可以看出,刘小捷的这段婚姻,注定又是不幸的。刘小捷和前夫佟兵闪婚闪恋又闪离,她和徐正,还是闪婚,这般激情冲动的女人,很容易被男人的花言巧语所蒙骗,被伤害也是情理之中的事情。无论对方说什么,做什么,都无条件支持他,相信他,周围人一旦劝谏,就立即反驳,这类女人,迟早要被“渣男”伤害得体无完肤。

  • 80后10年前的网吧(90年代网吧回忆录)

    “时至今日,回忆也在,情怀也在。”1999年前后网吧场景回忆录之《红警95联机对战版》1999年,美国袭击中国驻南斯拉夫大使馆,时至今日,依然让我们铭记在心。回忆录之《反恐精英》这款游戏是在1999年夏天诞生的,当年网吧最主流,最热门的游戏就是《反恐精英1.5》版本。

  • 黄瓜怎么加工好吃(怎样做黄瓜比较好吃)

    黄瓜怎么加工好吃黄瓜虾仁:黄瓜洗净后,去皮,切成小丁,备用。虾仁洗净,放入淀粉、生抽、料酒、少许白胡椒,抓匀腌制30分钟。锅中热油,放入姜丝炒出香味,放入虾仁,翻炒至变色。黄瓜断生后关火,加少许盐调味即可。浇到黄瓜卷上,想要好看就从底部倒入。放进保鲜袋拍裂,取出掰成小段。之后倒掉所出的汁水,将黄瓜放入大碗内。韩式甜辣酱2勺、柠檬汁1勺、可尔必思2勺、芝麻油1勺。