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

news2024/10/2 16:15:07

众所周知,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 * 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用起来和这些库以及其他加速方法有什么差别,胡渊鸣也给出了详细的优缺点对比,感兴趣的朋友可以戳下面的链接详细查看:

太极taichi

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

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

相关文章

Springboot配置文件加密

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、jasypt二、使用步骤1.引入依赖2.添加配置3.生成密钥3.idea启动添加环境变量3.linux环境启动报错前言 前面叙述了数据传递过程中的加密,需要使用…

docker 命令 相关

mysql 主从复制: 一主多从配置 主服务器:容器名mysql-master,端口3307 从服务器:容器名mysql-slave1,端口3308 从服务器:容器名mysql-slave2,端口3309 注意:如果此时防火墙是开启…

[附源码]计算机毕业设计JAVA星期八酒店管理系统

[附源码]计算机毕业设计JAVA星期八酒店管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM myba…

ASEMI整流桥堆GBJ406的作用,GBJ406整流桥型号及参数

编辑-Z GBJ406整流桥型号及参数,ASEMI整流扁桥GBJ406电性参数为4A反向电压600V;浪涌电流Ifsm为120A;工作温度为:-55℃~150℃;采用台湾进GPP芯片中有4个芯片,芯片尺寸84MIL。 GBJ406参数描述 型号&#xf…

FCPX插件Yanobox Motype for mac(43种动画发生器)

Yanobox Motype mac版是要您后期制作的福音。插件仅适用于:Mac OSX 苹果系统下:Final Cut Pro X 、Motion,Premiere Pro和After Effects剪辑软件。随意更改字体大小和位置,随意制作你喜欢的视频! 提供了一个多功能的…

从根上理解Cglib与JDK动态代理

最近在阅读到了Spring源码对于两种动态代理使用在不同场景下的使用,两种方式各有利弊写一篇文加深自己的认识。文中对于源码的涉及较少,更多的是作者自己的理解和举例,然后通过部分源码验证。 首先看两个面试经常会遇到的关于Spring的问题&a…

数理统计笔记7:分类数据分析-拟合优度检验和列联分析

引言 数理统计笔记的第7篇介绍了分类数据分析的方法,包括拟合优度检验和列联分析,给出了两者的卡方检验量的表达式,并且用例子进行了说明,最后谈了列联分析需要注意的问题。 引言什么是分类型数据拟合优度检验χ2\chi^2χ2统计量例…

使用AWS-AppSync实时监控物联网设备iOS端

aws-appsync-iot-core-实时iOS端示例 第一步参考如下资料 第一步找资料 网址: https://aws.amazon.com/cn/blogs/mobile/iot-with-aws-appsync/ iOS的sdk是 : https://github.com/aws-amplify/aws-sdk-ios android的sdk是: https://gith…

[附源码]JAVA毕业设计基于web的公益募捐网站(系统+LW)

[附源码]JAVA毕业设计基于web的公益募捐网站(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目…

Apache JMeter压测工具

1.工具介绍 是什么 JMeter是一个软件,使负载测试或业绩为导向的业务(功能)测试不同的协议或技术。 Apache软件基金会的Stefano Mazzocchi JMeter的最初的开发。他写道:它主要对 Apache JServ(现在称为如Apache Tomcat…

项目管理工具dhtmlxGantt入门教程(一):如何安装dhtmlxGantt

您可以使用 NuGet 、 Bower 或 npm 包管理器将 dhtmlxGantt 包安装到您的项目中,也可以从 CDN 中包含必要的 JS/CSS 文件。 DhtmlxGantt正版试用下载(qun:764148812)https://www.evget.com/product/4213/download NuGet 安装 dhtmlxGantt …

C++使用gRPC实例

什么是gRPC RPC 即远程过程调用协议(Remote Procedure Call Protocol),可以让我们像调用本地对象一样发起 远程调用。RPC 凭借其强大的治理功能,成为解决分布式系统通信问题的一大利器。 gRPC是一个现代的、高性能、开源的和语言…

Python数据分析实战-实现一维列表(数组)和多维列表(数组)的相互转化(附源码和实现效果)

前面我介绍了可视化的一些方法以及机器学习在预测方面的应用,分为分类问题(预测值是离散型)和回归问题(预测值是连续型)(具体见之前的文章)。 从本期开始,我将做一个数据分析类实战…

[附源码]计算机毕业设计springboot校园疫情管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

文件的上传与下载

文章目录一、 实验目的:二、实验要求:三、实验内容:1、单文件上传2、多文件上传3、上传文件的大小限定4、实现文件的下载功能,并解决下载乱码问题一、 实验目的: 掌握Servlet的HttpServletRequest对文件上传的支持&am…

内存管理---分页机制

目录 物理内存管理带来的问题 直接映射 一级页表 二级页表 参考: (C语言内存七)分页机制究竟是如何实现的? - Smah - 博客园 物理内存管理带来的问题 比如4GB的flash, 如果应用程序可直接访问物理内存,那么可能一个…

云小课|基于华为云WAF的日志运维分析,构筑设备安全的城墙

阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 摘要:云日志服务用于收集来自主机和云服务的日志数据&#x…

windows安装docker版青龙面板

1.下载docker Docker Desktop 官方下载地址: windows docker 2 管理员运行PowerShell,执行下面的命令(Hyper-V 和容器特性) Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All3.运行第一步下载好的exe 双击下载的 Docker fo…

springboot基于vue.js的掌上博客系统的设计与实现毕业设计源码063131

Springboot掌上博客系统的设计与实现 摘 要 掌上博客系统是当今网络的热点,博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体,Blog站点所形成的网状结构促成了不同于以往社区的Blog文化,Blog技术缔造了“博客”文化。 本文课…

恶补了 Python 装饰器的八种写法,你随便问~

对于每一个学习 Python 的同学,想必对 符号一定不陌生了,正如你所知, 符号是装饰器的语法糖,符号后面的函数就是我们本文的主角:装饰器。 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个…