胡渊鸣:加一行import,让Python代码提速100倍!

c0f6aeccb12ab241fcb0ff15fbb24a04.jpeg

文 | 丰色 发自 凹非寺
源 | 量子位

众所周知,Python的简单和易读性是靠牺牲性能为代价的——尤其是在计算密集的情况下,比如多重for循环。不过现在,大佬胡渊鸣说了:

只需import 一个叫做“Taichi”的库,就可以把代码速度提升100倍

c783f0239134a3052f99373cd7434b18.png

不信?

来看三个例子。

计算素数的个数,速度x120

第一个例子非常非常简单,求所有小于给定正整数N的素数。

标准答案如下:

2d2f872e91caf61272be647f6a8f0616.png

我们将上面的代码保存,运行。

当N为100万时,需要2.235s得到结果:

515e968c6d0eca7c4c62cad5f2a9000c.png

现在,我们开始施魔法。

不用更改任何函数体,import“taichi”库,然后再加两个装饰器:

18d5c982872a136ed91f5a3f11854bd0.png

Bingo!同样的结果只要0.363s,快了将近6倍。

21a1bb88a99580f9520ec35bb203aab3.png

如果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],得到如下递归关系:

8df94d941214d1fcef0d3721eeedc595.png

完整代码如下:

b8fcb9d0e8252f95408cc5e5a501b0ee.png

现在,我们用Taichi来加速:

4fb5e0b6c33888b465869915fa7da913.png

结果如下:

56c9d40a1cc4bd8e7101f7836f05e65d.png

胡渊鸣电脑上的程序最快做到了0.9秒内完成,而换成用NumPy来实现,则需要476秒,差异达到了超500倍!

最后,我们再来一个不一样的例子。

反应 - 扩散方程,效果惊人

自然界中,总有一些动物身上长着一些看起来无序但实则并非完全随机的花纹。

f9d71e7b7f9fc1593de8e96141b9c053.png

图灵机的发明者艾伦·图灵是第一个提出模型来描述这种现象的人。

在该模型中,两种化学物质(U和V)来模拟图案的生成。这两者之间的关系类似于猎物和捕食者,它们自行移动并有交互:

  1. 最初,U和V随机分布在一个域上;

  2. 在每个时间步,它们逐渐扩散到邻近空间;

  3. 当U和V相遇时,一部分U被V吞噬。因此,V的浓度增加;

  4. 为了避免U被V根除,我们在每个时间步添加一定百分比 (f) 的U并删除一定百分比 (k) 的V。

上面这个过程被概述为“反应-扩散方程”:

b23a1d579b86b9e39e3e9b8acf343838.png

其中有四个关键参数:Du(U的扩散速度),Dv(V的扩散速度),f(feed的缩写,控制U的加入)和k(kill的缩写,控制V的去除)。

如果Taichi中实现这个方程,首先创建网格来表示域,用vec2表示每个网格中U, V的浓度值。

拉普拉斯算子数值的计算需要访问相邻网格。为了避免在同一循环中更新和读取数据,我们应该创建两个形状相同的网格W×H×2。

每次从一个网格访问数据时,我们将更新的数据写入另一个网格,然后切换下一个网格。那么数据结构设计就是这样:

c57b004bf543d4a2f259f2327a6f8b9a.png

一开始,我们将U在网格中的浓度设置为 1,并将V放置在50个随机选择的位置:

0a2bf18bbd9566e02d64214f1f22c56a.png

那么实际计算就可以用不到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 * cendu = 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的浓度对结果进行染色,就可以得到这样一个效果惊人的图案

e06a0b5af3f10fcadbbb5b487e04a102.gif

有趣的是,胡渊鸣介绍,即使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

4bb2ab1ae675022dc176a3832cc8c460.jpeg后台回复关键词【入群

加入卖萌屋NLP、CV、搜推广与求职讨论群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python3语音识别模块_『开源项目』基于STM32的智能垃圾桶之语音识别

大家好,我是『芯知识学堂』的SingleYork,前面给大家简单介绍了『开源项目』基于STM32的智能垃圾桶之成员简介,相信有很多小伙伴都已经忍不住跃跃欲试了,别着急,从这一篇开始,笔者将会带领大家一步一步来完成…

LeetCode 945. 使数组唯一的最小增量(贪心)

1. 题目 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。 返回使 A 中的每个值都是唯一的最少操作次数。 示例 1: 输入:[1,2,2] 输出:1 解释:经过一次 move 操作,数组将变为 [1, 2, 3]。…

突然发现被点名(理想恋人游戏)

被debbie点名了.从debbie那里也看到了一个理想好男人应该具有的特点,努力!不过一下子想不出来八个条件,想想再写.(注: 理想恋人游戏规则:被点到名的人,回答八个你理想恋人的条件。必须点名八个人一起与你玩游戏。如果被点名者,已完成这游戏,…

手机电脑的芯片主要是由_全体起立!苹果自研电脑芯片登场,iOS迎大更新…WWDC20精彩远不止这些...

科技观潮techsina与浪同行打造一个自己能全局掌控的硬件一个自己完全掌控的系统找人来开发App创造生态繁荣。让它有用、好用,让更多人用——这一系列动作,我们曾在iPhone的历史上都亲眼见证过。出品 / 新浪科技 ID:techsina作者 / 晓光视频 /…

有人已经在用AI画色图了...

文 | 雷叔说事知乎一最近,一些画师是真的有点急了。倒不是因为参加美国科罗拉多州博览会美术比赛没得奖而无能狂怒。是因为第一名,根本就不是个人。原来,在这届比赛中获得“数字艺术/数字修饰照片”大奖的作品是AI生成的。Jason Allen是一家桌…

LeetCode 1389. 按既定顺序创建目标数组

1. 题目 给你两个整数数组 nums 和 index。你需要按照以下规则创建目标数组: 目标数组 target 最初为空。按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组中的下标 index[i] 处插入值 nums[i] 。重复上一步,直到在 nums 和 i…

AlphaFold 2被曝真实场景的预测能力太差??

文 | 李梅、黄楠源 | AI科技评论2018 年,Deepmind 首次发布基于深度神经网络的蛋白质结构预测数据库 AlphaFold,在蛋白质预测中实现了最先进的性能;去年,AlphaFold 2 获得了 98.5% 的蛋白质预测率;前段时间&#xff0c…

外贸SOHO经验

经验一: SOHO的挂靠外贸公司的数字分析 我已经有3年多代理出口工作经验,结合我自己的工作经验和实际情况,想写一个文章来阐述一下这个话题,希望能够抛砖引玉,给广大的SOHO们一些启发。 SOHO与客户沟通3绝招 &#xff0…

平行空间怎么设置32位_高低床怎么设置不占空间

工作忙要父母带孩子或是有了二胎,房子紧张住不下。最简单实用的方法就是添置双层床。双层床怎样布置空间利用率更高,对于老人带孩子或不同年龄阶段的孩子还是有所差别的。常规的双层床都长这样的。双层床对于儿童最大的挑战就是安全问题,如果…

LeetCode 1390. 四因数

1. 题目 给你一个整数数组 nums,请你返回该数组中恰有四个因数的这些整数的各因数之和。 如果数组中不存在满足题意的整数,则返回 0 。 示例: 输入:nums [21,4,7] 输出:32 解释: 21 有 4 个因数&#x…

聊聊工业界“AI算法创新”乱象

文 | Sirius几天前,卖萌屋的一期推文《AI凉下来了?这可能是个好事》在短短几小时内获得近百次点赞在看和800多次转发,引起了不少小伙伴的共鸣。不过由于批判和叙事太过露骨,打马不彻底,导致删文。删文后,这…

个人编程思想理解的片段(主要是面向对象的,参考了许多人的观点,还不成熟,没形成系统,请大家多指点)...

编程思想的发展 面向过程 面向对象 新的发展对面向对象的补充有 面向方面面向对象的三种表现效果 封装 继承 多态面向对象的实质 用类对现实世界进行抽象,用对象对现实世界的存在和运行进行模拟,使程序世界更加接近于现实世界。 封…

LeetCode 1391. 检查网格中是否存在有效路径(BFS)

文章目录1. 题目2. 解题2.1 BFS2.2 爆栈的DFS2.3 不爆栈的DFS1. 题目 给你一个 m x n 的网格 grid。网格里的每个单元都代表一条街道。grid[i][j] 的街道可以是: 1 表示连接左单元格和右单元格的街道。2 表示连接上单元格和下单元格的街道。3 表示连接左单元格和下…

软件oem要注意什么_化妆品OEM客户要着重注意这3个基本点,不然就吃大亏了

作为品牌方客户,确定化妆品OEM代工后,虽然生产的一切事务由化妆品OEM工厂完成,但是仍然需要注意这3个基本点!1. 合规性首先,产品只有备案流程全部完成,并且通过后才能进入市场销售,正常情况下是…

沉痛悼念!中国NLP 先行者、机器翻译鼻祖刘倬逝世

作者 | 李梅编辑 | 陈彩娴来源 | AI科技评论AI 科技评论获悉,中国机器翻译事业的开创者之一、原中国社科院语言研究所研究员刘倬老师与世长辞,享年 89 岁。沉痛悼念刘倬老师!刘倬,1933 年 4 月 4 日生于河北省大成县。1949 年从北…

今天很累……

今天,用了一整天时间去研究解决Tapestry3.0的StaleLinkException问题,可能太集中精神了,下午到了快下班的时候感到十分疲倦,眼睛有点痛。Todays Conclusion:天外有天,人上有人,任何时候都需要自…

如何 给给软件开发 添加 代理_如何与软件开发公司有效沟通

从最初的想法到可运行的软件,软件开发过程是十分繁杂的,既不想被细节淹没,又希望留有控制力,与软件开发公司沟通要如何做才能事半功倍呢?1,共享业务语义所谓业务语义,就是需求背后所思所想&…

LeetCode 1392. 最长快乐前缀(KMP)

1. 题目 「快乐前缀」是在原字符串中既是 非空 前缀也是后缀(不包括原字符串自身)的字符串。 给你一个字符串 s,请你返回它的 最长快乐前缀。 如果不存在满足题意的前缀,则返回一个空字符串。 示例 1: 输入&#x…

火到海外破圈!这个国产AI项目GitHub标星8.6k,价值千万

Q:最顶尖的AI技术到底离我们有多远? A:三行Python代码的距离。 导读 今天小编为大家推荐一个AI领域相当优秀的项目, 粗略估计,这个项目价值超过千万, 当前star 8.6k,大胆预判,这个项…

让互联网助小组合作一臂之力

利用互联网实现小组合作,目前显然还有诸多不便,原因何在?许多人都在网上实现了互联,小组合作似乎应该有诸多便利。但为什么维护一个可供小组其他成员共享和编辑的文件夹依然困难重重?为什么如果大家不使用相同的即时通…