0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

import让Python代码速度提升百倍

OpenCV学堂 来源:量子位 作者:量子位 2022-09-15 15:25 次阅读

	

众所周知,Python的简单和易读性是靠牺牲性能为代价的——

尤其是在计算密集的情况下,比如多重for循环。

不过现在,大佬胡渊鸣说了:

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

不信?

来看三个例子。

计算素数的个数,速度x120

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

标准答案如下:

31bfd76c-31eb-11ed-ba43-dac502259ad0.png

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

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

31cecd76-31eb-11ed-ba43-dac502259ad0.png

现在,我们开始施魔法。

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

31d5e872-31eb-11ed-ba43-dac502259ad0.png

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

31e02a8a-31eb-11ed-ba43-dac502259ad0.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],得到如下递归关系:

31fa953c-31eb-11ed-ba43-dac502259ad0.png

完整代码如下:

32261392-31eb-11ed-ba43-dac502259ad0.png

现在,我们用Taichi来加速:

32316864-31eb-11ed-ba43-dac502259ad0.png

结果如下:

32406c24-31eb-11ed-ba43-dac502259ad0.png

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

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

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

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

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

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

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

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

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

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

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

325c11cc-31eb-11ed-ba43-dac502259ad0.png

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

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

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

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

326a2708-31eb-11ed-ba43-dac502259ad0.png

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

32790eb2-31eb-11ed-ba43-dac502259ad0.png

那么实际计算就可以用不到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用起来和这些库以及其他加速方法有什么差别,胡渊鸣也给出了详细的优缺点对比。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4751

    浏览量

    68357
  • python
    +关注

    关注

    56

    文章

    4782

    浏览量

    84457
  • import
    +关注

    关注

    0

    文章

    15

    浏览量

    1949

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

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    中国成功研发出世界首台拟态计算机 效能提升百倍

    拟态计算机的最大特点是高效能。测试表明,针对特定运算任务的能效比可提升数十到数百倍。尽管拥有巨大的发展潜力,但邬院士表示,拟态计算机距离投入应用,还需要突破一些理论、工程问题。
    发表于 09-22 10:05 1307次阅读

    opa380异常损坏,放大倍数衰减十到百倍,不可恢复,为什么?

    在使用opa380时,经常出现原先正常工作的电路,突然信号值直线下降,输出信号衰减十到百倍,但是变化趋势一致,不可恢复,更换opa380芯片后正常
    发表于 07-29 06:51

    速度提升百倍 美科学家在4英寸基体上制成石墨薄膜

    速度提升百倍 美科学家在4英寸基体上制成石墨薄膜  美国宾夕法尼亚州立大学光电材料中心(Electro-Optics Center Materials Division:EOC)的研究人员最近成功地在4英寸(100mm)大
    发表于 02-05 10:22 489次阅读

    英研发新型存储器 速度比闪存快百倍

      英国研究人员最近报告说,他们研发出一种基于“电阻性记忆体”的新型存储设备,与现在广泛使用的闪存相比,耗电量更低,而存取速度要快上一百倍
    发表于 05-21 08:45 518次阅读

    英研发出比闪存快百倍的新型存储器

    英国研究人员最近报告说,他们研发出一种基于“电阻性记忆体”的新型存储设备,与现在广泛使用的闪存相比,耗电量更低,而存取速度要快上一百倍
    发表于 05-21 11:22 708次阅读

    三星5G网络 速度为4G数百倍下电影仅1秒

    5G网络比现行4G网络的传输速度快数百倍,整部超高画质电影可在1秒之内下载完成。随着5G技术的诞生,用智能终端分享3D电影、游戏以及超高画质(UHD)节目的时代已向我们走来。
    发表于 06-17 09:31 1756次阅读

    区块链技术的出现为游戏市场带来了增长十百倍的可能性

    在区块链游戏分发平台BlockGame看来,目前游戏行业正处于瓶颈期,区块链技术的出现为游戏市场带来了增长十百倍的可能性。
    发表于 10-09 11:35 788次阅读

    什么样的币可能是百倍

    百倍币顾名思义就是币价会从最初的募资阶段到某个时点上涨百倍,而币价要上涨百倍也就意味着市值大概也要上涨百倍
    发表于 07-18 14:41 4792次阅读

    AI医疗心血管的攻克将使医疗手段提速百倍

    马云亲自推进的人工智能项目有了重大突破。据介绍,该项目用于攻克心血管,比之传统医疗手段能提速百倍
    发表于 08-19 09:11 1880次阅读

    达摩院遥感AI升级将提高5处理速度

    阿里巴巴达摩院表示,在一周内升级了遥感AI技术,开发出应用于防汛的水体识别算法,支持水利部相关监测与分析工作,在重点超警戒水位地区,处理影像数量比平时提升5,影像分析速度提升
    发表于 08-06 15:08 806次阅读

    Cloudam云端如何助力企业实现计算效率数百倍提升

    近日,Cloudam云端与国内某知名药企与合作,通过接入Cloudam云端自主研发的云E云超算服务,计算效率提高的数百倍。这也是云算力在生命科学领域的又一次成功应用。Cloudam云端云E云超算服务是如何帮助该药企实现计算效率数百倍
    发表于 03-17 10:53 434次阅读

    简述python包模块import和from及all

    python指定导入目录路径,称为包导入。 通过import和from导入包模块。 通过**all**指定导入的模块和导入的模块属性。 ## 1.1 pythonimpo
    的头像 发表于 02-21 14:20 1217次阅读

    浅析python模块创建和from及import使用

    python模块通过用python程序编写的.py文件即可创建,通过from及import语句导入模块来使用。
    的头像 发表于 02-21 14:44 806次阅读

    import模块的导入方法

    import 加载的模块分为四种类型: 使用python编写的代码 .py 文件 已被编译为共享库或 DLL 的C或C++扩展 一组模块的包 使用C编写并链接到python解释器的
    的头像 发表于 09-11 17:31 1178次阅读

    rom…import导入代码介绍

    不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差, 一般生产环境中尽量避免使用 实操代码: from math import pi , sin print ( sin
    的头像 发表于 09-11 17:35 912次阅读