软件/语言版本: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