python numpy等差矩阵_格子玻尔兹曼方法(LBM)Python 程序提速

众所周知,python是一门解释型语言,相比于C/C++等编译型语言程序运行的运行速度慢。在我使用python的日常中多半是编写数值模拟程序,程序主要结构就是一个for循环下面跟着各种各样的计算公式。如果用原生的python一点一点循环的话,这个速度已经不能用慢来形容了,请早早放弃。

通常提高这种类型程序运行速度的思路都是把循环尽可能地改为矩阵,python中有一个和矩阵很相似的数据类型叫做列表。此处请注意,python的列表可以理解为一个各种数据类型的容器,与数学中的矩阵还是有很大的差别,同时python的列表也并不支持常规的矩阵运算,所以原生的python基本无法满足我们编写数值模拟程序的基本速度需求。

OK,那怎么办呢?

如果不改变硬件的条件下,只有两条路就是优化算法或使用第三方工具包。这个“或者”用的可能不太准确,更具体地讲就是在使用第三方工具包的情况下优化算法。那么有哪些第三方工具包可用呢?


First tool: pypy

有关pypy加速的方法在之前的文章中以及提过了,但最近我使用pypy得到了一些新的感受,虽然程序确实比原生的python快了,but有很多新的问题。比如我下载最新版的pypy在我的两台 win10笔记本上都无法运行,查了报错原因网上有人说是因为我相关的路径中有中文,我查了很多文件夹都没有中文所以基本没法使用。然后我曲线救国莫名其妙地把它用起来了。但当我使用面向对象编程,使用class函数的时候电脑又报错了导致我直接放弃了这个东西。

如果你熟悉python肯定知道用python进行科学计算逃不了的一个库就是numpy,有太多轮子是基于这个库出现的了,如果你不用numpy那么你就得不断地自己造轮子,然而pypy并不支持numpy(这个不支持不是不可以使用,而是调用了numpy之后程序又变回龟速,当然也可能是我水平有限没设置好的原因),综合以上种种我宣布永久性放弃pypy。

Second tool: numpy

numpy我不用过多的介绍了,这里就只说一件事就是在我放弃了pypy之后使用numpy到底有没有提升运算速度。这个地方用数据说话,上一篇文章中的热方腔流程序,同样的测试条件pypy计算需要3h的情况下numpy改良后需要约2h,略有提升。

但是这个略有提升是在把循环尽可能调整为矩阵的前提下进行的,这就需要很多脑力,稍有不慎用错矩阵或者重复计算,这个优良的性能就没了,所以在这个例子的情况下numpy确实快了并且我认为还有可优化的空间。

那么下面的问题就是优化的这么点时间到底值不值得我们去思考怎么把循环改为矩阵?答案是值得,因为改完矩阵后,numpy还可以升级

Third tool:cupy

虽然numpy提升速度的效果不太明显,但是numpy上面有很多好轮子,比如cupy。如果你电脑里面有一个Nivida的独立显卡并且平时也不怎么用得到的时候,你就会发现,真香。cupy基本兼容numpy的指令,所以修改起来只需一秒,把程序的numpy改成cupy。那么运行速度提升的效果如何呢?上方同样的案例只需要50min,这个效果就很喜人了。而且最恐怖的是我使用的测试案例并没有到达cupy的最佳性能区间,也就是说数据量越庞大,这个速度提升的效果就会越好,而且好的惊人。我做了一组测试,以我编写的lbm代码为例:

  • 网格数51*51 numpy 300it/s cupy 80it/s
  • 网格数81*81 numpy 150it/s cupy 80it/s
  • 网格数101*101 numpy 74it/s cupy 80it/s
  • 网格数151*151 numpy 15it/s cupy 62it/s

我只尝试到了这个格子数,发现格子数小的时候,cupy有种大炮打蚊子的感觉,但是越到后面两者的速度差距就会越大。

所以以上,循环改矩阵+numpy+cupy是我用python写程序从各个角度来说都很完美的组合,如果有相关需求的同志看到了我的文章不要走弯路,如果你还有更好的想法,欢迎评论区留言~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值