我写了一个非常糟糕的优化C代码,它做了一个简单的数学计算:#include
#include
#include
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
unsigned long long int p(int);
float fullCheck(int);
int main(int argc, char **argv){
int i, g, maxNumber;
unsigned long long int diff = 1000;
if(argc < 2){
fprintf(stderr, "Usage: %s maxNumber\n", argv[0]);
return 0;
}
maxNumber = atoi(argv[1]);
for(i = 1; i < maxNumber; i++){
for(g = 1; g < maxNumber; g++){
if(i == g)
continue;
if(p(MAX(i,g)) - p(MIN(i,g)) < diff && fullCheck(p(MAX(i,g)) - p(MIN(i,g))) && fullCheck(p(i) + p(g))){
diff = p(MAX(i,g)) - p(MIN(i,g));
printf("We have a couple %llu %llu with diff %llu\n", p(i), p(g), diff);
}
}
}
return 0;
}
float fullCheck(int number){
float check = (-1 + sqrt(1 + 24 * number))/-6;
float check2 = (-1 - sqrt(1 + 24 * number))/-6;
if(check/1.00 == (int)check)
return check;
if(check2/1.00 == (int)check2)
return check2;
return 0;
}
unsigned long long int p(int n){
return n * (3 * n - 1 ) / 2;
}
然后我尝试(只是为了好玩)把它移植到Python下,看看它会有什么反应。我的第一个版本几乎是1:1的转换,运行速度非常慢(Python为120秒以上,C为1秒)。
我做了一些优化,这是我得到的:
^{pr2}$
它的运行时间大约为16秒,比C语言好,但也几乎慢了20倍。
现在,我知道在这类计算中,C比Python好,但是我想知道的是,我是否遗漏了一些东西(Python方面,比如一个非常慢的函数之类)可以使这个函数更快。
请注意,我使用的是python3.1.1,如果这有区别的话