gpt4 book ai didi

python - 为什么Python中的这段代码比C++快得多?

转载 作者:行者123 更新时间:2023-12-03 07:11:52 25 4
gpt4 key购买 nike

在Python中,我有以下简单代码:

N = 10000
mu = 0.0001
iterations = 10000
l = 10

@nb.njit()
def func1(N, l, mu, iterations):
intList = [0]*N
for x in range(iterations):
for number in range(N):
for position in range(l):
if random.random() < mu:
intList[number] = intList[number] ^ (1 << position)

func1(N, l, mu, iterations)

count = 1
print(timeit(lambda: func1(N, l, mu, iterations), number=count))
>>> 5.677
我不习惯C++,但想看看它与Python版本相比有多快。由于我的Python代码非常简单,所以我想可以尝试一下。我的C++代码应该等效于Python代码是
#include <iostream>
#include <random>

using namespace std;

int func1(int iterations, int l, int N, float mu)
{
std::random_device rd; //Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
std::uniform_real_distribution<> dis(0.0, 1.0);
std::vector<int> intList(N);

//for (int i = 0; i < N; i++)
// cout << intList[i];
//cout << "\n";
int x, number, position;
for (x = 0; x < iterations; x++) {
for (number = 0; number < N; number++) {
for (position = 0; position < l; position++) {
if (dis(gen) < mu) {
intList[number] = intList[number] ^ (1 << position);
}
}
}
}
//for (int i = 0; i < N; i++)
// cout << intList[i];
return 0;
}

int main()
{
int N, l, iterations;
float mu;
N = 10000;
mu = 0.0001;
iterations = 10000;
l = 10;
func1(iterations, l, N, mu);
cout << "\nFertig";
}
但是此代码最多需要花费5-10倍的时间。我真的为此感到惊讶。对此有什么解释?

最佳答案

将Numba internally translates random.random calls转换为其own inlined internal Mersenne Twister implementation。因此,LLVM可以有效地将整个func1编译为高效代码。就像其他实现一样,它也可能是用C++编写的。
因此,当我在启用优化的情况下编译您的C++实现时,我无法重现您的问题,这不足为奇。两种实现本质上是相同的。在我的机器上,Python代码运行约6.1秒,而C++代码运行约6.9秒。
但是,如果您希望走得更快,请注意,如果您希望以较低的突变概率有效地实现遗传突变(看起来确实如此),最好先以概率μ生成Binomial distribution,然后选择那么多索引而不用从您的基因组长度进行替换。另外,我描述了here的方法。

关于python - 为什么Python中的这段代码比C++快得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64901084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com