众所周知,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改进后需要2左右h,略有提升。
然而,这尽可能将循环调整为矩阵的前提下,略有改进需要大量的脑力。如果你不小心使用了错误的矩阵或重复计算,这种优异的性能就会消失,所以在这个例子中numpy真的很快,我觉得还有优化的空间。
所以下面的问题是优化这么多时间是否值得思考如何将循环改为矩阵?答案是值得的,因为改变矩阵后,numpy还可以升级
Third tool:cupy
虽然numpy提高速度的效果不是很明显,但是numpy上面有很多好轮子,比如cupy。如果你的电脑里有一个Nivida当你平时不怎么用独立显卡的时候,你会发现它真的很香。cupy基本兼容numpy所以修改程序只需要一秒钟numpy改成cupy。那么提高运行速度的效果如何呢?上面同样的案例只需要50个min,这种效果非常令人满意。最可怕的是,我使用的测试案例还没有到达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写程序从各个角度都是完美的组合。如果有相关需求的同志看到我的文章,不要走弯路。如果你有更好的想法,请在评论区留言~