让我们从三个数组开始dtype=np.double.使用numpy 1.7.1在intel CPU上执行计时,编译icc并链接到intel mkl.带有numpy 1.6.1的AMD cpu与gccwithout 编译mkl也用于验证时序.请注意,时序与系统大小几乎呈线性关系,并不是由于numpy函数if语句中产生的小开销,这些差异将以微秒而非毫秒显示:
arr_1D=np.arange(500,dtype=np.double)
large_arr_1D=np.arange(100000,dtype=np.double)
arr_2D=np.arange(500**2,dtype=np.double).reshape(500,500)
arr_3D=np.arange(500**3,dtype=np.double).reshape(500,500,500)
Run Code Online (Sandbox Code Playgroud)
首先让我们看一下这个np.sum函数:
np.all(np.sum(arr_3D)==np.einsum('ijk->',arr_3D))
True
%timeit np.sum(arr_3D)
10 loops, best of 3: 142 ms per loop
%timeit np.einsum('ijk->', arr_3D)
10 loops, best of 3: 70.2 ms per loop
Run Code Online (Sandbox Code Playgroud)
鲍尔斯:
np.allclose(arr_3D*arr_3D*arr_3D,np.einsum('ijk,ijk,ijk->ijk',arr_3D,arr_3D,arr_3D))
True
%timeit arr_3D*arr_3D*arr_3D
1 loops, best of 3: 1.32 s per loop
%timeit np.einsum('ijk,ijk,ijk->ijk', arr_3D, arr_3D, arr_3D)
1 loops, best of 3: 694 ms per loop
Run Code Online (Sandbox Code Playgroud)
外产品:
np.all(np.outer(arr_1D,arr_1D)==np.einsum('i,k->ik',arr_1D,arr_1D)) …Run Code Online (Sandbox Code Playgroud) 我尝试过这两种选择
objective = lambda A, x : (np.dot(x.T ,np.dot(A, x)))[0,0]
objective = lambda A, x : (np.matrix(x).T * np.matrix(A) * np.matrix(x))[0,0]
Run Code Online (Sandbox Code Playgroud)
对于主要的我使用我的算法获得5秒的运行时间使用次要我得到14秒
用MATLAB我得了2秒
我想和Numpy一起去,但显然我需要一种方法来改善这种糟糕的结果.如何获得更快的二次型矩阵,矢量积?
注意:我描述了代码,这个lambda函数饮用了所有的汁液. 改进:我只是删除了scipy和numpy的原生Ubuntu包,然后安装了以下内容
sudo pip install numpy
sudo apt-get install libatlas-base-dev gfortran
sudo pip install scipy
sudo apt-get install libpng-dev libfreetype6-dev
sudo pip install matplotlib
Run Code Online (Sandbox Code Playgroud)
我提高了性能,但仍低于Matlab