Python 特征矩阵与Numpy阵列乘法性能

Python 特征矩阵与Numpy阵列乘法性能,python,c++,numpy,eigen,Python,C++,Numpy,Eigen,我读到了eigen有很好的性能。然而,我试图比较eigenMatrixXi乘法速度与numpy数组乘法。而numpy的性能更好(约26秒,而不是约29秒)。有没有更有效的方法来实现这一点 这是我的密码: 努比: import numpy as np import time n_a_rows = 4000 n_a_cols = 3000 n_b_rows = n_a_cols n_b_cols = 200 a = np.arange(n_a_rows * n_a_cols).reshape(n

我读到了
eigen
有很好的性能。然而,我试图比较
eigen
MatrixXi
乘法速度与
numpy
数组
乘法。而
numpy
的性能更好(约26秒,而不是约29秒)。有没有更有效的方法来实现这一点

这是我的密码:

努比:

import numpy as np
import time

n_a_rows = 4000
n_a_cols = 3000
n_b_rows = n_a_cols
n_b_cols = 200

a = np.arange(n_a_rows * n_a_cols).reshape(n_a_rows, n_a_cols)
b = np.arange(n_b_rows * n_b_cols).reshape(n_b_rows, n_b_cols)

start = time.time()
d = np.dot(a, b)
end = time.time()

print "time taken : {}".format(end - start)
结果:

time taken : 25.9291000366
Time taken : 29.05
特征值:

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{

  int n_a_rows = 4000;
  int n_a_cols = 3000;
  int n_b_rows = n_a_cols;
  int n_b_cols = 200;

  MatrixXi a(n_a_rows, n_a_cols);

  for (int i = 0; i < n_a_rows; ++ i)
      for (int j = 0; j < n_a_cols; ++ j)
        a (i, j) = n_a_cols * i + j;

  MatrixXi b (n_b_rows, n_b_cols);
  for (int i = 0; i < n_b_rows; ++ i)
      for (int j = 0; j < n_b_cols; ++ j)
        b (i, j) = n_b_cols * i + j;

  MatrixXi d (n_a_rows, n_b_cols);

  clock_t begin = clock();

  d = a * b;

  clock_t end = clock();
  double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
  std::cout << "Time taken : " << elapsed_secs << std::endl;

}

我正在使用
numpy 1.8.1
eigen 3.2.0-4
我的问题在评论中由@Jitse Niesen和@ggael回答

我需要添加一个标志来在编译时打开优化:
-O2-DNDEBUG
(O是大写的O,不是零)

包含此标志后,
eigen
代码运行时间为
0.6
秒,而无此标志时运行时间为
~29
秒。

更改:

a = np.arange(n_a_rows * n_a_cols).reshape(n_a_rows, n_a_cols)
b = np.arange(n_b_rows * n_b_cols).reshape(n_b_rows, n_b_cols)
进入:

这使我的笔记本电脑至少提高了100倍:

time taken : 11.1231250763
vs:


除非你真的想乘以整数。在Eigen中,将双精度数字相乘也会更快(相当于将MatrixXi替换为MatrixXd三次),但我只看到了1.5个因素:所用时间:0.555005 vs 0.846788。

是否在启用优化的情况下编译?这是一个巨大的不同。在我的笔记本电脑上,Eigen需要0.6秒,Python几乎需要10秒。@JitseNiesen,可能不会,如何在计算机上进行优化编译?我运行了这一行
g++-std=c++11-I/usr/include/eigen3 time\u eigen.cpp-o my\u exec
@ggael,谢谢。当我运行:g++-std=c++11-I/usr/include/eigen3 time_eigen.cpp-o my_exec-02-DNDEBUG时,我得到以下错误:g++:error:unrecogned命令行选项'-02'。我也试着通过谷歌找到了答案,但不知道有什么用处。你有什么建议吗?在没有
-02
的情况下编译对性能没有帮助。@Akavall ggael编写的-O2是“减去大写字母-o 2”,而不是零。@AviGinsburg,谢谢,我一定是瞎子了。这确实加快了速度。谢谢!非常有趣,你们知道这是为什么吗?我们应该仔细检查一下,但我猜若矩阵是浮点,那个么乘法是由外部库完成的。如果不是,则通过简单的“三个嵌套for循环”算法进行乘法。需要注意的是,对于这种大小的矩阵,正确选择乘法算法很重要,这一点可以通过文件得到证实:(行约930到1030)Bul所有这些都不能解释执行速度中的因子100。图书馆很重要,但不是那么多……我希望最多是10.但是<代码> EGIN <代码>代码仍然与<代码> NoMPy < /Cord>版本一致。标志-O2-DNDebug怎么办?
time taken : 11.1231250763
time taken : 0.124922037125