网易首页 > 网易号 > 正文 申请入驻

胡渊鸣:import一个“太极”库,让Python代码提速100倍!

0
分享至

  • 丰色 发自 凹非寺
    量子位 | 公众号 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.kernel
def 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 - 1, j] + uv[phase, i, j - 1] - 4.0 * cen
du = Du * lapl[0] - cen[0] * cen[1] * cen[1] + feed * (1 - cen[0])
dv = Dv * lapl[1] + cen[0] * cen[1] * cen[1] - (feed + kill) * cen[1]
val = cen + 0.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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
队长,别走!安帅劝34岁老将留下:皇马备好合同,等他签字

队长,别走!安帅劝34岁老将留下:皇马备好合同,等他签字

叶青足球世界
2024-06-05 16:07:37
逼良为娼,被强迫拍了50部三级片:从车模到女优,她只走错了一步

逼良为娼,被强迫拍了50部三级片:从车模到女优,她只走错了一步

爱过的人去了哪里
2022-06-19 16:40:26
善恶终有报!曾为安倍晋三哭丧的吕丽萍已然彻底沦为一个“笑话”

善恶终有报!曾为安倍晋三哭丧的吕丽萍已然彻底沦为一个“笑话”

小影的娱乐
2024-06-04 17:29:59
女演员长相有多重要?看看《墨雨云间》的吴谨言和陈乔恩就知道了

女演员长相有多重要?看看《墨雨云间》的吴谨言和陈乔恩就知道了

不八卦会死星人
2024-06-03 17:34:50
你信不?美股新高A股肯定跳水!

你信不?美股新高A股肯定跳水!

龙行天下虎
2024-06-06 10:23:40
小猪:德国人有些忽视了克罗斯,他回德国队就是要向国人证明自己

小猪:德国人有些忽视了克罗斯,他回德国队就是要向国人证明自己

直播吧
2024-06-05 12:12:09
总局应对:许晓婷抵达香港,丁霞或被退!新助教登场,或接管比赛

总局应对:许晓婷抵达香港,丁霞或被退!新助教登场,或接管比赛

热血排球通
2024-06-06 10:13:53
独行侠或1-0先拔头筹,反客为主!

独行侠或1-0先拔头筹,反客为主!

篮板英雄联盟
2024-06-06 10:07:07
美国不愧是上一代基建狂魔:近百年来他们都在给密西西比河铺地砖

美国不愧是上一代基建狂魔:近百年来他们都在给密西西比河铺地砖

今日美食分享
2024-05-30 14:06:31
领导要求女子单独出差后续:聊天记录曝光,领导回应,果然有情况

领导要求女子单独出差后续:聊天记录曝光,领导回应,果然有情况

黄昏的晚霞
2024-06-06 04:05:22
两性爆炸:什么,女生也会“早泄”?

两性爆炸:什么,女生也会“早泄”?

坟头长草
2024-06-05 10:09:19
多了块电池的混动汽车,凭啥油耗能到2.9升?油车为何却做不到?

多了块电池的混动汽车,凭啥油耗能到2.9升?油车为何却做不到?

奔跑的赛场
2024-06-06 06:07:59
上头的命令是电瓶车全链条整治,怎么实施起来就只针对老百姓

上头的命令是电瓶车全链条整治,怎么实施起来就只针对老百姓

生活百态小故事
2024-06-05 17:25:05
反噬来了!和汪峰官宣后,森林北更新美照,却被嘲是民办公务员

反噬来了!和汪峰官宣后,森林北更新美照,却被嘲是民办公务员

晋哥说电影
2024-06-05 23:03:23
被美国骗了?嫦娥六号在月背升起五星红旗:画面暴露真实宇宙景象

被美国骗了?嫦娥六号在月背升起五星红旗:画面暴露真实宇宙景象

奇趣科学探秘
2024-06-05 21:34:31
人的4大能量来源:食物、情绪、智慧和高维,读到便是你开悟之时

人的4大能量来源:食物、情绪、智慧和高维,读到便是你开悟之时

失语者云骧
2024-06-05 15:09:54
真是技不如人?阿波罗登月直播2个多小时,嫦娥6号不直播引质疑

真是技不如人?阿波罗登月直播2个多小时,嫦娥6号不直播引质疑

贾文彬的史书
2024-06-04 20:56:49
618大促,消费者用行动警告国产手机,超过3000都不买了

618大促,消费者用行动警告国产手机,超过3000都不买了

柏铭锐谈
2024-06-05 11:31:04
结束21年职业生涯!官方:38岁前国脚冯潇霆退役

结束21年职业生涯!官方:38岁前国脚冯潇霆退役

直播吧
2024-06-05 21:52:05
何润东这老婆娶得真值!这么朴素的打扮都穿出气质来,五官太出挑

何润东这老婆娶得真值!这么朴素的打扮都穿出气质来,五官太出挑

木木尔时尚
2024-06-06 09:35:30
2024-06-06 11:12:49
量子位
量子位
追踪人工智能动态
9493文章数 175312关注度
往期回顾 全部

科技要闻

对话戴文渊:大模型价格战不解决核心问题

头条要闻

媒体:欧盟高官称对华贸易要"公平平衡" 其实话中有话

头条要闻

媒体:欧盟高官称对华贸易要"公平平衡" 其实话中有话

体育要闻

赴美试训的崔永熙,表现究竟怎么样?

娱乐要闻

看这场笑话,经过王一博同意了吗!

财经要闻

特步和七匹狼世纪联姻 家族身价超600亿?

汽车要闻

2025年将推10款新车 长安启源7个月累销破10万

态度原创

教育
游戏
房产
数码
公开课

教育要闻

天津十项举措护航高考,确保考生安心考试

PS射击游戏《星鸣特攻》有6种模式 后续英雄免费发布

房产要闻

新房交易再冲高!三个月1.7万套、157万㎡,海口楼市又行了!

数码要闻

XPG即将推出的掌上游戏PC采用注视点渲染和CAMM2可更换DRAM

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版