点击上方“视学算法”,选择加"星标"或“置顶

重磅干货,第一时间送达

丰色 发自 凹非寺
量子位 | 公众号 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 * 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的浓度对结果进行染色,就可以得到这样一个效果惊人的图案:‍

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

点个在看 paper不断!

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

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

    来源:量子位 众所周知,Python的简单和易读性是靠牺牲性能为代价的-- 尤其是在计算密集的情况下,比如多重for循环. 不过现在,大佬胡渊鸣说了: 只需import 一个叫做"Taich ...

  2. TaiChi Lang 让Python代码提速100倍!(高性能计算、图形学、仿真等领域;加速 Python 中计算密集任务程序;希望使用 Python 开发但部署到其它环境)

    1.TaiChi简介 Taichi 起步于 MIT 的计算机科学与人工智能实验室(CSAIL),设计初衷是便利计算机图形学研究人员的日常工作,帮助他们快速实现适用于 GPU 的视觉计算和物理模拟算法. ...

  3. 永恒python地速_立竿见影地把你的 Python 代码提速7倍

    之前曾经测试计算斐波那契数列的几种方法,其中基于递归的方法是速度最慢的,例如计算第 40 项的值,需要 36 秒.如下图所示. 要提高运算速度,根本办法当然是改进算法.不过算法的提高是一个长期积累加上 ...

  4. 立竿见影地把你的 Python 代码提速7倍

    之前曾经测试计算斐波那契数列的几种方法,其中基于递归的方法是速度最慢的,例如计算第 40 项的值,需要 36 秒.如下图所示.很多人学习python,不知道从何学起. 很多人学习python,掌握了基 ...

  5. 用 Taichi 加速 Python:提速 100+ 倍!

    这是「进击的Coder」的第 706 篇技术分享 作者:太极图形 来源:太极图形 " 阅读本文大概需要 13 分钟. " Python 已经成为世界上最流行的编程语言,尤其在深度学 ...

  6. 用 Taichi 加速 Python:提速 100+ 倍

    Python 已经成为世界上最流行的编程语言,尤其在深度学习.数据科学等领域占据主导地位.但是由于其解释执行的属性,Python 较低的性能很影响它在计算密集(比如多重 for 循环)的场景下发挥作用 ...

  7. 密码学实验题_03.3_AES实验_利用Sage构建AES的S盒和逆S盒(基于阅读Sage数学库的Python代码)

    密码学实验题_03.3_AES实验_利用Sage构建AES的S盒和逆S盒(基于阅读Sage数学库的Python代码) 3.    AES实验 3)    (思考题)利用Sage构建AES的S盒和逆S盒 ...

  8. python提升运行速度-一行代码让你的python运行速度提高100倍!Python真强!

    原标题:一行代码让你的python运行速度提高100倍!Python真强! Python用的好,猪也能飞起来. 今天,带大家学习如何让Python飞起来的方法,干货满满哦! python一直被病垢运行 ...

  9. 胡渊鸣的「太极图形」又融了5000万美元,下一步:3D内容创作平台

    来源:量子位 胡渊鸣大神这边传来新进展. 他创办的太极图形,官宣完成A轮融资-- 5000万美元,由源码资本.GGV纪源资本.BAI 资本联合领投,以及天使轮投资者红杉中国加码. 与此同时,太极图形还 ...

最新文章

  1. Netflix创始人:我不要求996,一样市值1万亿
  2. MIT长篇论文:我们热捧的AI翻译和自动驾驶,需要用技术性价比来重估
  3. python中使用html前端页面显示图像预测结果(改进)
  4. 交叉分解+Cross decomposition
  5. 稳定婚姻问题(自己的总结)
  6. 软件测试入门三年经验
  7. office2013安装程序找不到office.zh-cn\officeMUI.xml 最新解决方案
  8. python统计词频_Python统计四六级考试的词频
  9. linux 下访问mysql
  10. 排查指南 | 关于 mPaaS-iOS 小程序打不开问题的解决方案
  11. windows7自带录制屏幕怎么用
  12. hadoop--常见错误及解决方法
  13. 行云管家 V4.7产品新特性-国际化版本、支持Oracle的数据库审计、主机密码自动修改策略 发布日期:2018-11-22...
  14. 一起学java【5】---原生态数据类型使用陷阱
  15. Chrome 插件 CrxMouse 去除后门优化版
  16. 基于FPGA的循迹小车,控制器:Xilinx-Ego1
  17. MCU低功耗设计(一)理论
  18. 什么是OBD及组成和作用、工作原理
  19. 【考研经验】2018福州大学考研初试+复试心得
  20. 服务器更换桌面壁纸,通过VBS更换桌面设置壁纸源码

热门文章

  1. “应试教育的死穴,恰在于堵住了孩子“犯错”空间”——有感
  2. 如何调整android手机正常颜色,安卓手机怎么调颜色反转
  3. [c++]project reference and link
  4. Semantic Kernel 入门系列
  5. 本是后山人,偶做前堂客
  6. Uva 12660 - Ears Cutting
  7. ArcGis辅助编号功能的插件式实现
  8. STC89C52RC40I-LQFP44简介
  9. Teigha.NET V19 操作DWG、DXF文件
  10. 投资理财启蒙之如何能够挣到100万?