全国免费咨询:

13245491521

VR图标白色 VR图标黑色
X

中高端软件定制开发服务商

与我们取得联系

13245491521     13245491521

2022-09-11_胡渊鸣大神:import一个“太极”库,让Python代码提速100倍!

您的位置:首页 >> 新闻 >> 行业资讯

胡渊鸣大神:import一个“太极”库,让Python代码提速100倍! 来源:量子位 众所周知,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)来模拟图案的生成。这两者之间的关系类似于猎物和捕食者,它们自行移动并有交互: 最初,U和V随机分布在一个域上; 在每个时间步,它们逐渐扩散到邻近空间; 当U和V相遇时,一部分U被V吞噬。因此,V的浓度增加; 为了避免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 defcompute(phase:int): fori,jinti.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 推荐阅读 西电IEEE Fellow团队出品!最新《Transformer视觉表征学习全面综述》润了!大龄码农从北京到荷兰的躺平生活(文末有福利哟!)如何做好科研?这份《科研阅读、写作与报告》PPT,手把手教你做科研一位博士在华为的22年奖金675万!3位科学家,斩获“中国诺贝尔奖”!又一名视觉大牛从大厂离开!阿里达摩院 XR 实验室负责人谭平离职 最新 2022「深度学习视觉注意力 」研究概述,包括50种注意力机制和方法!【重磅】斯坦福李飞飞《注意力与Transformer》总结,84页ppt开放下载!2021李宏毅老师最新40节机器学习课程!附课件+视频资料 欢迎大家加入DLer-计算机视觉技术交流群! 大家好,群里会第一时间发布计算机视觉方向的前沿论文解读和交流分享,主要方向有:图像分类、Transformer、目标检测、目标跟踪、点云与语义分割、GAN、超分辨率、人脸检测与识别、动作行为与时空运动、模型压缩和量化剪枝、迁移学习、人体姿态估计等内容。 进群请备注:研究方向+学校/公司+昵称(如图像分类+上交+小明) ??长按识别,邀请您进群!

上一篇:2023-08-16_【招聘】位于上海的 W、bangX、HardCandy 硬糖 等你来撩 下一篇:2025-09-17_「AI助手」真来了?谷歌牵头推进Agent支付协议AP2

TAG标签:

18
网站开发网络凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设网站改版域名注册主机空间手机网站建设网站备案等方面的需求...
请立即点击咨询我们或拨打咨询热线:13245491521 13245491521 ,我们会详细为你一一解答你心中的疑难。
项目经理在线

相关阅读 更多>>

猜您喜欢更多>>

我们已经准备好了,你呢?
2022我们与您携手共赢,为您的企业营销保驾护航!

不达标就退款

高性价比建站

免费网站代备案

1对1原创设计服务

7×24小时售后支持

 

全国免费咨询:

13245491521

业务咨询:13245491521 / 13245491521

节假值班:13245491521()

联系地址:

Copyright © 2019-2025      ICP备案:沪ICP备19027192号-6 法律顾问:律师XXX支持

在线
客服

技术在线服务时间:9:00-20:00

在网站开发,您对接的直接是技术员,而非客服传话!

电话
咨询

13245491521
7*24小时客服热线

13245491521
项目经理手机

微信
咨询

加微信获取报价