为什么是c++;代码实现的性能不比python实现好吗?

为什么是c++;代码实现的性能不比python实现好吗?,python,c++,performance,Python,C++,Performance,我正在为寻找数据点的最近邻进行基准测试。我的C++实现和Python实现几乎都执行相同的执行时间。不应该是C++比原始Python实现更好。 C++执行时间:8.506秒 Python执行时间:8.7202秒 C++代码: #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括//标准::物联网 使用名称空间std; 使用名称空间std::chrono; 双edist(双*arr1,双*arr2,单元n){ 双和=0.0; 对于(int i=0;i>N>>M; N=1000; M=8

我正在为寻找数据点的最近邻进行基准测试。我的C++实现和Python实现几乎都执行相同的执行时间。不应该是C++比原始Python实现更好。
  • C++执行时间:8.506秒
  • Python执行时间:8.7202秒
C++代码:
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括//标准::物联网
使用名称空间std;
使用名称空间std::chrono;
双edist(双*arr1,双*arr2,单元n){
双和=0.0;
对于(int i=0;i>N>>M;
N=1000;
M=800;
双精度**arr=新双精度*[N];
std::random_device rd;//从硬件获取一个随机数
std::mt19937 eng(rd());//为生成器设置种子
标准:均匀真实分布(10.0,60.0);
对于(int i=0;i这个C++代码能进一步从编码或其他角度得到优化吗?< /P>
我可以看到至少三个优化。前两个很简单,而且肯定应该完成,但在我的测试中,它们最终不会对运行时产生可测量的影响。第三个优化需要最低限度地重新思考代码

  • edist
    计算代价高昂的平方根,但您仅使用距离进行两两比较。由于平方根函数是单调递增的,它对比较结果没有影响。类似地,
    pow(x,2)
    可以替换为
    x*x
    ,有时速度更快:

    双edist(标准::向量常量和arr1,标准::向量常量和arr2,uint n){
    双和=0.0;
    for(无符号整数i=0;i
  • argsort
    执行复制,因为它返回不包括第一个元素的索引。如果改为包含第一个元素(将return语句更改为
    return idx;
    ),则可以避免可能代价高昂的复制

  • 您的矩阵表示为嵌套数组(出于某种原因,您使用原始指针而不是嵌套的
    std::vector
    )。通常将矩阵表示为连续的N*M数组更有效:
    std::vector arr(N*M)
    。这也是numpy在内部表示矩阵的方式。这需要更改代码以计算索引


  • 没有提供工具链规范和完全编译命令,没有优化问题。我刚在我的机器上执行了两个代码(G++-9和Python 3)。C++程序大约需要1秒,而Python脚本则需要10秒。可能丢失了一些东西(例如编译器优化)。尝试
    g++-std=c++11 knn.cpp-o-O3 knn
    @Pygirl确保您发出了正确的命令(即
    g++-std=c++11-O3-march=native-o knn knn.cpp
    ),以获得正确的代码,无需优化即可构建(因为它编译速度更快,运行速度无关紧要),但对于计时测试,您应该让编译器使用-O2或-O3(生成速度较慢,但结果运行速度较快)进行优化,告诉编译器编译的平台(-march=…)还可以帮助它使用您的机器提供的更好的指令生成代码,这些指令可能不一定在通用指令集中可用,否则默认情况下将成为目标。额外积分奖励:最后一个建议实际上使代码的速度最低,而非更快。请解释原因并提出解决方法。
    g++ -std=c++11 knn.cpp -o knn