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 < n; i++)
- 现在您完全错过了第 0 个索引。
另外,您忘记在 C++ 代码中释放该 int 数组。您应该在函数末尾添加delete[] solutions
。那,或者你可以使用std::vector<int>
。
【参考方案1】:
您可以尝试优化此循环,例如将其设置为没有 if 的单个块,或者使用 C 中的模块。 C++ 编译器做了 Python 运行时不能做的优化,所以使用纯解释器你永远不会得到任何接近的性能。 而且 1M 的交互次数很多,我不会从该范围内的任何解释器开始,你最好在浏览器和 javascript 中进行。
【讨论】:
以上是关于python和c++程序之间不寻常的速度差异的主要内容,如果未能解决你的问题,请参考以下文章