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

news2024/11/15 21:50:29

众所周知,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
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

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

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

相关文章

0-1规划在编程问题中的应用(UnityC#脚本/折返约瑟夫/OpenGL机器人摆臂循环)

一、0-1规划的定义 百度百科的解释:0-1规划是决策变量仅取值0或1的一类特殊的整数规划。在处理经济管理中某些规划问题时,若决策变量采用 0-1变量即逻辑变量,可把本来需要分别各种情况加以讨论的问题统一在一个问题中讨论。 如上面所说&…

记csdn打不开或打开缓慢后的修复--如何查找dns并修改hosts文件

记csdn打开缓慢后的修复–如何查找dns并修改hosts文件 问题: CSDN文章打开的十分缓慢,经常出现无法打开页面的错误提示 (以前用的好好的,现在不知道公司局域网改了什么东西,导致我的电脑打开CSDN经常缓慢好久&#x…

ACM - 其他算法 - 基础(前缀和 + 差分)

ACM- 其他算法 一、前缀和模板例题1、区间余数求K倍区间个数:AcWing 1230. K倍区间例题2、前缀和哈希求最长个数平分子串:Leetcode 面试题 17.05 字母与数字 二、差分1、一维差分2、二维差分 一、前缀和 模板 //一维前缀和 S[i] a[1] a[2] ... a[i] a[l] ... …

【行情速递】MLCC龙头涨价;车厂砍单芯片;台积电28nm设备订单全部取消!

导语:进入第二季度,MLCC龙头三环集团官宣涨价!风华高科紧随其后。车市价格战蔓延至芯片端,车厂开始砍单芯片,短短半年时间不到,车用芯片市场从价格飞涨和一片难求的背景,转为砍单与降价促销...更多详情请阅…

智能警示输出器在ESD系统中的作用

ESD(Electrostatic Discharge)是指静电放电,是一种电子元器件损坏的主要原因之一。在电子制造业中,ESD防静电系统是非常重要的,可以有效地保护电子元器件,避免因静电放电而造成的损坏和故障。而智能警示输出…

Spring事务(编程式事务声明式事务)

Spring中编程式事务的实现: 此方式包含了三个重要的操作:获取事务、提交事务、回滚事务。 以及依赖两个重要的对象:DataSourceTransactionManager、TransactionDefinition 使用编程式事务示例: RestController public class Use…

进程间通信都有哪些方法?

进程间通信是架构复杂系统的基石。复杂系统往往是分成各种子系统、子模块、微服务等等,按照 Unix 的设计哲学,系统的每个部分应该是稳定、独立、简单有效,而且强大的。系统本身各个模块就像人的器官,可以协同工作。而这个协同的枢…

后端常用的加密算法及hash运算

文章目录 基础知识1.加密三要素2.常用的两种加密方式⭐️3.凯撒密码 对称加密1. 编码概念2. DES — Data Encryption Standard3. 3DES — Triple-DES4. AES — Advanced Encryption Standard5. 分组密码模式6. 在golang中使用对称加密⭐️6.1 填充函数6.2 DESCBC API接口6.3 AE…

Git Clone 报错 `SSL certificate problem: unable to get local issuer certificate`

如果您在尝试克隆Git存储库时得到 “SSL certificate problem: unable to get local issuer certificate” 的错误,这意味着Git无法验证远程存储库的SSL证书。如果SSL证书是自签名的,或者SSL证书链有问题,就会发生这种情况。 $ git clone https://githu…

2021年上半年网络工程师真题详解(全套)

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 1、以下关于RISC和CISC计算机的叙述中,正确的是( )。 A、RISC不采用流水线技术,CISC采用流水线技术 B、RISC使用…

若依框架AjaxResult改造适应Swagger接口文档

概述 若依框架后端使用的响应对象AjaxResult,和Swagger存在不兼容问题,导致返回体即使使用了Swagger注解,但是Swagger接口文档中,不显示返回体的对象Swagger文档: [外链图片转存失败,源站可能有防盗链机制,建议将图片…

【Linux】Linux入门学习之常用命令二

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

Flutter学习之旅 - 路由

文章目录 Flutter路由介绍普通路由普通路由传值 命名路由将routes的配置提到外面(使用的是Map)命名路由传值 路由跳转返回上一级路由替换路由返回到根路由返回Tabs后到指定页面 Flutter路由介绍 flutter中的路由通俗就是页面跳转。在Flutter中通过Navigator(学过reactjs或小程序…

idea使用Database连接数据库报错ssm证书验证失败无法建立安全连接

项目场景: idea使用Database连接数据库报错ssm证书验证失败无法建立安全连接 问题描述 [08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferenc…

Java Agent

摘要 ​ JavaAgent就是Java探针,是一个JVM插件,常用于代码热更新,AOP,JVM监控等功能。这个技术对大多数的同学来说可能有点陌生,但是对Java软件开发人员来说肯定都多多少少接触过,只是相对其原理&#xff…

Selenium技术在CentOS6.8系统的腾讯云服务器上的相关使用

目录 一、解释说明二、操作过程中Linux相关命令1、下载谷歌浏览器2、查看谷歌浏览器的版本3、下载对应版本的谷歌驱动(或者本地上传)4、解压下载的文件5、移动下载文件6、给予文件执行权限7、更新pip3到最高版本8、下载Selenium第三方库9、正式测试10、最…

C#学习笔记--由浅至深理解IEnumerable和IEnumerator

目录 前言总结 IEnumerable 和 IEnumeratorIEnumerable是什么?IEnumerator是什么?总结 结尾预告 前言 上篇文章我是自己实现了一个容器C#学习笔记–实现一个可以重复权重并且能够自动排序的容器–MultiplySortedSet 写完之后突然想到一个问题&#xff…

PMP课堂模拟题目及解析(第6期)

51. 管理层将一个国际项目分配给一位新项目经理。这是该项目经理第一次与团队合作,团队成员位于两个国家,数量平均分布,一个团队由最合适作为个人工作的成员组成,另一个团队由最适合作为团队工作的成员组成。项目经理该怎么做&am…

抖音商城小程序搭建的注意事项

抖音商城小程序已经成为了越来越多电商企业的选择,毕竟它具有强大的用户资源和社交传播力。但是,在搭建抖音商城小程序的过程中,还有一些需要注意的事项。 1、制定明确的策略和目标 在搭建抖音商城小程序前,必须事先制定明确的策…

65.网站个性框架

之前介绍过集中个性网站 严肃优雅型极简主义普通/中性大胆/自信平静祥和创业/上进俏皮/好玩 严肃优雅型 概述 奢华和优雅的设计,基于细小的衬线字体、金色或粉色的颜色和高质量的大图片。 行业 房地产、高端时尚、饰品类,奢侈产品或服务 排版 有衬…