python和c++程序之间不寻常的速度差异

Posted

技术标签:

【中文标题】python和c++程序之间不寻常的速度差异【英文标题】:unusual speed difference between python and c++ programs 【发布时间】:2014-12-01 17:53:51 【问题描述】:

我用 C++ 和 Python 编写了相同的程序。在 Python 中,它需要异常多的时间(实际上我没有得到答案)。谁能解释这是为什么?

C++ 代码:

#include<iostream>
using namespace std;
int main()
    int n = 1000000;
    int *solutions = new int[n];
    for (int i = 1; i <= n; i++)
        solutions[i] = 0;
    

    for (int v = 1; v <= n; v++)
        for (int u = 1; u*v <= n; u++)
             if ((3 * v>u) & (((u + v) % 4) == 0) & (((3 * v - u) % 4) == 0))
                solutions[u*v]++;
            
        
    
    int count = 0;
    for (int i = 1; i < n; i++)
        if ((solutions[i])==10)
        count += 1;
    
    cout << count;

Python 代码:

n=1000000
l=[0 for x in range(n+1)]
for u in range(1,n+1):
    v=1
    while u*v<n+1:
         if (((u+v)%4)==0) and (((3*v-u)%4)==0) and (3*v>u):
            l[u*v]+=1
         v+=1

l.count(10)

【问题讨论】:

python 中的迭代代码往往会因为解释器而变慢。请参阅:Why Python is so slow for a simple loop。您应该尝试使用 numpy 的数组操作来编写算法,或者尝试像 numba 这样的 JIT 编译器。 在 2.x 中考虑xrange 而不是range(1, n+1),我可能会考虑将l 改为dict(或collections.Counter)。 您在 C++ 代码中有未定义的行为(使其成为新的 int[n+1];) ...或将第一个 for 循环更改为 for (int i = 0; i &lt; n; i++) - 现在您完全错过了第 0 个索引。 另外,您忘记在 C++ 代码中释放该 int 数组。您应该在函数末尾添加delete[] solutions。那,或者你可以使用std::vector&lt;int&gt; 【参考方案1】:

您可以尝试优化此循环,例如将其设置为没有 if 的单个块,或者使用 C 中的模块。 C++ 编译器做了 Python 运行时不能做的优化,所以使用纯解释器你永远不会得到任何接近的性能。 而且 1M 的交互次数很多,我不会从该范围内的任何解释器开始,你最好在浏览器和 javascript 中进行。

【讨论】:

以上是关于python和c++程序之间不寻常的速度差异的主要内容,如果未能解决你的问题,请参考以下文章

我的 Qt C++ 程序以不寻常的方式终止

C++ vs python numpy 复杂数组的性能

从 python 程序执行 C++ 程序

C++ 和 C# 速度测试 - 奇怪的结果

OpenCV、Python 和 C++:应用程序请求运行时以异常方式终止

使用 C++ 的 VS6 和 VS2008 之间的数值精度差异?