Octave 的性能与 Matlab 和 Scilab 的比较
Performance of Octave compared to Matlab and Scilab
我在 Octave、Scilab 和 Matlab 提示符下测试了以下命令。
>> A = rand(10000,10000);
>> B = rand(10000,1);
>> tic,A\B;, toc
时间分别在 40、15.8 和 15.7 秒左右。作为比较,Mathematica 的性能是
In[7]:= A = RandomReal[{0, 1}, {10000, 10000}];
In[9]:= B = RandomReal[{0, 1}, 10000];
In[10]:= Timing[LinearSolve[A, B];]
Out[10]= {14.125, Null}
这是否表明 Octave 在线性方程领域不如其他软件强大?
我认为你的测试有缺陷。 A\B
背后的算法利用方程组中的特殊模式和结构,因此执行时间在很大程度上取决于 random(10000,10000)
生成的内容。在我的机器上使用 Octave 4.0.0
进行了三种不同的运行,你的代码 returns 7.1s
、95.1s
和 16.4s
。这表明随机生成的第一个矩阵可能是稀疏的,当您使用 Scilab 和 Matlab 测试代码时可能就是这种情况。因此,除非您确保算法正在评估同一件事,或者除非您以合理的方式平均执行时间(这对我来说不是很容易找到),否则像您那样比较它们是没有意义的.
您应该 运行 每个测试大约一千次或更多次。另请注意,它们应该使用相同的算法,但微调程度稍差。一种更明智的方法是在许多不同维度上对许多案例进行测试并对结果进行平均。
大多数矩阵数学来自 LAPACK. 不同之处在于 Matlab 具有带有 fortran 和 C++ 的 dll,它们可能稍微好一些。我相信他们可以更好地利用您的数学协处理器。它被称为英特尔 MKL 内核。
实际算法根据矩阵的结构和大小而变化。
@dimitris 感谢您提出问题,我发现您的方法对于快速比较很有帮助,我现在得到的有些不同的答案很有趣。我没有遇到其他受访者提到的问题,答案(时间)一致且有帮助。
这是我的 Windows 机器(Asus with Ryzen 7 4700U)上的时间,我为 Scilab 6.1.0、Octave 6.2.0、Python 3.8 中的每一个打印了 5 次运行.7 和 Julia 1.5.3) - 我一直在探索将它们用于我目前的工作的可能性。我没有(买不起..)Matlab 或 Mathematica,所以这些都没有结果..
八度
>> for i=1:5;A=rand(10000,10000);B=rand(10000,1);tic;A\B;toc,end;
Elapsed time is 9.79964 seconds.
Elapsed time is 9.78249 seconds.
Elapsed time is 9.70953 seconds.
Elapsed time is 9.73357 seconds.
Elapsed time is 9.69932 seconds.
Scilab
--> for i=1:5;A=rand(10000,10000);B=rand(10000,1);tic;A\B;toc,end;
ans = 10.407628
ans = 10.706747
ans = 10.490241
ans = 10.773073
ans = 10.517951
朱莉娅
m=10000;
for i=1:5;
A=rand(m,m);B=rand(m,1);
t=time();A\B;
println(time()-t)
end;
7.833999872207642
7.7170000076293945
7.675999879837036
7.76200008392334
7.740999937057495
Python
from pylab import *
import numpy as np
import datetime as dt
N = 10000
for i in range(5):
A = np.random.random((N,N))
B = np.random.random((N,1))
tic=dt.datetime.now()
np.linalg.solve(A,B)
print((dt.datetime.now()-tic))
0:00:05.567395
0:00:05.703859
0:00:05.050467
0:00:04.995202
0:00:05.294050
我在 Octave、Scilab 和 Matlab 提示符下测试了以下命令。
>> A = rand(10000,10000);
>> B = rand(10000,1);
>> tic,A\B;, toc
时间分别在 40、15.8 和 15.7 秒左右。作为比较,Mathematica 的性能是
In[7]:= A = RandomReal[{0, 1}, {10000, 10000}];
In[9]:= B = RandomReal[{0, 1}, 10000];
In[10]:= Timing[LinearSolve[A, B];]
Out[10]= {14.125, Null}
这是否表明 Octave 在线性方程领域不如其他软件强大?
我认为你的测试有缺陷。 A\B
背后的算法利用方程组中的特殊模式和结构,因此执行时间在很大程度上取决于 random(10000,10000)
生成的内容。在我的机器上使用 Octave 4.0.0
进行了三种不同的运行,你的代码 returns 7.1s
、95.1s
和 16.4s
。这表明随机生成的第一个矩阵可能是稀疏的,当您使用 Scilab 和 Matlab 测试代码时可能就是这种情况。因此,除非您确保算法正在评估同一件事,或者除非您以合理的方式平均执行时间(这对我来说不是很容易找到),否则像您那样比较它们是没有意义的.
您应该 运行 每个测试大约一千次或更多次。另请注意,它们应该使用相同的算法,但微调程度稍差。一种更明智的方法是在许多不同维度上对许多案例进行测试并对结果进行平均。
大多数矩阵数学来自 LAPACK. 不同之处在于 Matlab 具有带有 fortran 和 C++ 的 dll,它们可能稍微好一些。我相信他们可以更好地利用您的数学协处理器。它被称为英特尔 MKL 内核。
实际算法根据矩阵的结构和大小而变化。
@dimitris 感谢您提出问题,我发现您的方法对于快速比较很有帮助,我现在得到的有些不同的答案很有趣。我没有遇到其他受访者提到的问题,答案(时间)一致且有帮助。
这是我的 Windows 机器(Asus with Ryzen 7 4700U)上的时间,我为 Scilab 6.1.0、Octave 6.2.0、Python 3.8 中的每一个打印了 5 次运行.7 和 Julia 1.5.3) - 我一直在探索将它们用于我目前的工作的可能性。我没有(买不起..)Matlab 或 Mathematica,所以这些都没有结果..
八度
>> for i=1:5;A=rand(10000,10000);B=rand(10000,1);tic;A\B;toc,end;
Elapsed time is 9.79964 seconds.
Elapsed time is 9.78249 seconds.
Elapsed time is 9.70953 seconds.
Elapsed time is 9.73357 seconds.
Elapsed time is 9.69932 seconds.
Scilab
--> for i=1:5;A=rand(10000,10000);B=rand(10000,1);tic;A\B;toc,end;
ans = 10.407628
ans = 10.706747
ans = 10.490241
ans = 10.773073
ans = 10.517951
朱莉娅
m=10000;
for i=1:5;
A=rand(m,m);B=rand(m,1);
t=time();A\B;
println(time()-t)
end;
7.833999872207642
7.7170000076293945
7.675999879837036
7.76200008392334
7.740999937057495
Python
from pylab import *
import numpy as np
import datetime as dt
N = 10000
for i in range(5):
A = np.random.random((N,N))
B = np.random.random((N,1))
tic=dt.datetime.now()
np.linalg.solve(A,B)
print((dt.datetime.now()-tic))
0:00:05.567395
0:00:05.703859
0:00:05.050467
0:00:04.995202
0:00:05.294050