众所周知 , 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来加速:
文章图片
结果如下:
- 程序员|程序员的口味变了!C++首次逆袭JAVA:跻身最受欢迎编程语言TOP3
- 【框架】123:spring框架之面向切面编程
- 【框架】124:spring框架之切面编程步骤说明
- 编程|事件回顾:强子走后,京东也基本废了
- 编程|台积电赴美设厂,投资400亿美元,将面临三大挑战,美梦恐成噩梦
- 编程|849元,入手8+128GB版的OPPOA36,那是真香!
- 软件|欧美国家要是禁止我们使用各种编程语言该怎么办?
- 编程|小米13 Pro全方位揭晓,陶瓷机身+1英寸超大底,有高端味了
- 好学编程:作为程序员,赚取额外收入的 4个简单副业!
- 教好孩子|少儿编程要不要学?不懂编程会被AI淘汰吗
