众所周知 , 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来加速:
文章图片
结果如下:
- 编程|引起连锁反应了?出货62台光刻机后,ASML又正式做出决定!
- 工业互联网|便宜!大疆可编程无人机仅需699元
- |嵌入式开发:防御性编程可缓解不可预见的问题
- 米家|JAVA等主流编程语言有无可能代替ABAP?
- 编程|iPhone 突遭禁售,因不送充电器
- 编程|先进工艺受阻、砍单关停光刻机?外媒:台积电大势已去
- 编程|买得起用不起?台积电或关闭部分EUV光刻机,外媒:变天了
- 编程|Redmi G Pro锐龙版首销获京东双料第一:i9顶配版在路上了
- 编程|影石Insta360 X3正式发布 可拍摄7200万像素全景照片
- 编程|看好AirPods Pro 2,却被价格劝退?国产旗舰耳机体验不输苹果