MATLAB

clear all;
clc;

a = rand(1220,1220);
tic;
for i=1:10
    fprintf("%i", i)
    eig(a);
end
toc;

返回结果如下:

12345678910Elapsed time is 6.629721 seconds.

Python

import numpy as np
from scipy.linalg import eig
from time import perf_counter
import sys

a = np.random.randn(1220, 1220)

tic = perf_counter()
for i in range(10):
    print(i, end='\r')
    np.linalg.eig(a)
toc = perf_counter()
print("Elapsed time is ", toc-tic)

返回结果如下:

Elapsed time is  93.00676925900007

Intel Python

与上面相同的程序,返回结果如下:

Elapsed time is  7.760291491999851

与 MATLAB 相近的水平。

总结

Intel 优化编译版本的 python ,在底层与 MATLAB 相似,会调用多个核。 除此以外 scipy.linalg 需要手动根据不同的矩阵选择不同的方法。比如对于实对称矩阵, 选择 eigh 会大大提升效率。而 MATLAB 则不需要手动选择。

重要的是想法,而选择什么方法,只是一种手段。

Reference