众所周知,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写程序从各个角度来说都很完美的组合,如果有相关需求的同志看到了我的文章不要走弯路,如果你还有更好的想法,欢迎评论区留言~

python可以应用lbm_格子玻尔兹曼方法(LBM)Python 程序提速相关推荐

  1. python可以应用lbm_格子玻尔兹曼方法(LBM)python程序提速

    研究生开学已经两周了,一直在学习跟LBM相关的编程知识.由于自己数值传热学的基础不是太好,为了能够快速地融入到现有的工作当中我将工作重心侧重在了编程方面,而不是相关模型和边界条件等的学习.我的主要参考 ...

  2. 格子玻尔兹曼流体代码_格子玻尔兹曼方法(LBM)学习:对流-扩散问题(附MATLAB代码)...

    (๑❛ᴗ❛๑) 麻烦各位读者收藏之余点个喜欢或赞呢,咱也更有干劲了~ OrzSunspot:格子玻尔兹曼方法(LBM)学习:等温不可压缩流体流动问题(附MATLAB代码)​zhuanlan.zhihu ...

  3. matlab lbm 代码,Matlab实现格子玻尔兹曼方法(Lattice Boltzmann Method,LBM)模拟

    %LBM的matlab代码 %Matlab实现格子玻尔兹曼方法(Lattice Boltzmann Method,LBM)模拟 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % c ...

  4. matlab boltzmann函数,Matlab实现格子玻尔兹曼方法(Lattice Boltzmann Method,LBM)模拟

    Matlab实现格子玻尔兹曼方法(Lattice Boltzmann Method,LBM)模拟 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % cylinder.m: Flow ...

  5. 格子玻尔兹曼方法(LBM)的学习笔记1(附Couette流源代码及解析)

    笔记目录 关于学习的教材及说明 在学习之前大致将流体力学学了一下包括一些概念的理解和重要的公式,在看这本<The Lattice Boltzmann Method Principles and ...

  6. 格子玻尔兹曼方法(LBM)计算中的无量纲化转化(将物理参数转化为格子参数)

    说明:方法来自外文资料,主要通过无量纲方法进行LBM仿真计算中由实际物理量到格子物理量的转化,保证其一致性 已知量 物理长度尺寸HHH : 格子长度尺寸 (自定义)H~\tilde{H}H~: 密度ρ ...

  7. [LBM方法学习笔记1】格子玻尔兹曼方法介绍

    本人LBM方法小白,记录一下自己的学习过程,因为LBM方法的公式比较多,所以为手写贴图,后面会考虑整理. [参考书]: 1.<The Lattice Boltzmann Method>,之 ...

  8. 格子玻尔兹曼在多孔介质孔隙尺度气泡输运调控中的应用和MATLAB仿真『需要数据和代码请先私信』

    引言 格子玻尔兹曼方法(Lattice Boltzmann Method, LBM)是一种基于介观(mesoscopic)模拟尺度的计算流体力学方法.该方法相比于其他传统CFD计算方法,具有介于微观分 ...

  9. 格子玻尔兹曼方法书中,计算机代码(Fortran语言)FDM的输出结果是什么,为什么显示程序“[25024] Console1.exe”已退出,返回值为 0 (0x0)。

    格子玻尔兹曼方法书中,计算机代码(Fortran语言)FDM的输出结果是什么,为什么显示程序"[25024] Console1.exe"已退出,返回值为 0 (0x0).

最新文章

  1. 【发现】Warcraft III v1.22 不用正版CDKey上Battle.net 续篇
  2. 自动分号插入 ASI
  3. c语言乘法表只有结果,要求输出结果显示相乘的两数及乘积怎么做?
  4. 是Excel的图,不!是R的图
  5. 乘积最大(信息学奥赛一本通-T1275)
  6. 再识PCI:一个PCI驱动实例
  7. GDAL虚拟文件简介
  8. 国都企信通短信平台发送手机短信的python脚本一例
  9. yacc c语言语法分析器,GitHub - waxnkw/yacc: 简陋版语法分析器
  10. 微信小程序————样式
  11. 华为云买网站买另外服务器,华为云网站在买其他服务器
  12. ue4 项目模板_卡牌游戏项目模板
  13. Educational Codeforces Round 97 (Rated for Div. 2)
  14. PAT 1007(简单粗暴)
  15. UnityShader入门精要——运动模糊
  16. 从B树、B+树、B*树谈到R 树
  17. 双系统安装deepin20_记录一次Windows+Deepin双系统安装及简单优化
  18. 关于海思HI3518+OV9712 ISP图像调试 - 夜视效果、曝光、图像稳定响应效果
  19. 蔚来汽车智能座舱Java面经(23 秋招提前批)
  20. STM32单片机与Openmv的串口通信

热门文章

  1. 如何判断QQ号码长度是否“合法”?
  2. linux下用squid和squidGuard配置代理服务器
  3. 阀门的开关方向_如何判断阀门的开关方向及正确操作阀门
  4. 基于ADAU1452DSP数字音频信号处理
  5. 计算机开机加载后进入不了xp,电脑开机启动后到xp画面后不断自动重启解决方法...
  6. simulink仿真及代码生成技术入门到精通_行星排混动从入门到精通(结构)
  7. 怎么制作有趣的GIF动态表情包
  8. DHCP自动获取ip地址
  9. 【Python随记】:curses 库的快速入门
  10. YDOOK :STM32 : 什么是波特率?波特率Baudrate 的定义