octave matlab python c++速度/效率 对比 附动图

软件/语言版本:Octave:5.2.0 Matlab:2019a python:3.7 c++:14

本文中所用的测试程序只包含基本运算和for循环,即本文并不探究这几种语言在进行向量/矩阵运算以及各种优化操作时的效率问题。

测试程序为计算一维热传导的代码,每完成1s的计算输出一次(计算1s需要500次循环(这个循环里还有一个几十次的内层循环))
计算30分钟 matlab与c++的耗时为 3s
计算2分钟 python的耗时为 31s,octave的耗时为210s

结论当只进行基本运算和for循环时,matlab的效率与c++不相上下,python与其相差约两个数量级,而octave又与python相差约一个数量级

可以看动图直观感受一下:

octave

在这里插入图片描述

matlab

在这里插入图片描述

python

在这里插入图片描述

c++

在这里插入图片描述

全部测试程序已上传至GitHub
(为了和matlab程序达到近似的运算量,对其他语言的程序进行了修改,所以逻辑上是不正确的,正确的代码在我的一篇讲解18国赛a题的文章中有)
matlab测试程序(来源18国赛a题优秀论文):

tic
clc
clear

ah1=110.9;ah2=8.329;
rho=[300,862,74.2,1.18]; %常数的设置 
c=[1377,2100,1726,1005]; 
lam=[0.082,0.37,0.045,0.028]; 
x=[0.0006,0.006,0.0036,0.005];
dx=[0.0001,0.001,0.0006,0.001]; %空间步长
dt=0.002; %时间步长 
Tout=75;Tin=37; %初始温度
LEN1=int8(x(1)/dx(1))+1; %记录每段接触点的位置 LEN2=LEN1+x(2)/dx(2);
LEN2=LEN1+x(2)/dx(2); 
LEN3=LEN2+x(3)/dx(3);
LEN4=LEN3+x(4)/dx(4);
T=zeros(5400/dt,LEN4);
T(1,:)=37; %0 秒设置所有点的温度是 37
h1=ah1;h2=ah2; %设置对流交换系数 
for n=1:5400/dt-1 
    if mod(n,500)==0 %每一秒输出一下
      n/500
    end
    unknow=(h1*(Tout-T(n,1))-lam(1)*(T(n,1)-T(n,2))/dx(1))*dt/(0.5*dx(1)*rho(1)*c(1))+T(n,1);
    T(n+1,1)=unknow; 
    for i=2:LEN1 
      if i>=2&&i<=LEN1-1 
        unknow=lam(1)*(T(n,i+1)-2*T(n,i)+T(n,i-1))/dx(1)*dt/(dx(1)*rho(1)*c(1))+T(n,i);
        T(n+1,i)=unknow;
      elseif i==LEN1 
      unknow=(lam(2)*(T(n,i+1)-T(n,i))/dx(2)+lam(1)*(T(n,i-1)-T(n,i))/dx(1))* dt/(0.5*(dx(1)*rho(1)*c(1)+dx(2)*rho(2)*c(2)))+T(n,i); 
      T(n+1,i)=unknow;
      end
    end 
    for i=LEN1+1:LEN2
      if i>=LEN1+1&&i<=LEN2-1
        unknow=lam(2)*(T(n,i+1)-2*T(n,i)+T(n,i-1))/dx(2)*dt/(dx(2)*rho(2)*c(2))+T(n,i); 
        T(n+1,i)=unknow;
      elseif i==LEN2
        unknow=(lam(3)*(T(n,i+1)-T(n,i))/dx(3)+lam(2)*(T(n,i-1)-T(n,i))/dx(2))*dt/(0.5*(dx(2)*rho(2)*c(2)+dx(3)*rho(3)*c(3)))+T(n,i);
        T(n+1,i)=unknow;
      end
    end 
    for i=LEN2+1:LEN3
      if i>=LEN2+1&&i<=LEN3-1 unknow=lam(3)*(T(n,i+1)-2*T(n,i)+T(n,i-1))/dx(3)*dt/(dx(3)*rho(3)*c(3))+T(n,i);
        T(n+1,i)=unknow;
      elseif i==LEN3 unknow=(lam(4)*(T(n,i+1)-T(n,i))/dx(4)+lam(3)*(T(n,i-1)-T(n,i))/dx(3))*dt/(0.5*(dx(3)*rho(3)*c(3)+dx(4)*rho(4)*c(4)))+T(n,i);
        T(n+1,i)=unknow;
      end
    end 
    for i=LEN3+1:LEN4
      if i>=LEN3+1&&i<=LEN4-1
      unknow=lam(4)*(T(n,i+1)-2*T(n,i)+T(n,i-1))/dx(4)*dt/(dx(4)*rho(4)*c(4))+T(n,i);
      T(n+1,i)=unknow;
      elseif i==LEN4
          unknow=(lam(4)*(T(n,LEN4-1)-T(n,LEN4))/dx(4)-h2*(T(n,LEN4)-Tin))*dt/(0.5*dx(4)*rho(4)*c(4))+T(n,LEN4);  
          T(n+1,i)=unknow;
      end 
    end
end 
T=T(:,LEN4); T=T(1:500:5400/dt);
toc

猜你喜欢

转载自blog.csdn.net/weixin_42378324/article/details/108299779