C比PyPy跑得慢

2024-04-16 07:15:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行这两个代码。它们都执行相同的数学过程(计算数列值直至大项),并且,正如预期的那样,产生相同的输出。你知道吗

但由于某些原因,PyPy代码的运行速度明显快于C代码。你知道吗

我不明白为什么会发生这种情况,因为我希望C代码运行得更快。你知道吗

如果有人能帮我澄清这一点,我会很感激的(也许有更好的方法来编写C代码?)你知道吗


C代码:

#include <stdio.h>
#include <math.h>

int main()
{
    double Sum = 0.0;
    long n;

    for(n = 2; n < 1000000000; n = n + 1) {
        double Sign;
        Sign = pow(-1.0, n % 2);        

        double N;
        N = (double) n;

        double Sqrt;
        Sqrt = sqrt(N);

        double InvSqrt;
        InvSqrt = 1.0 / Sqrt;

        double Ln;
        Ln = log(N);

        double LnSq;
        LnSq = pow(Ln, 2.0);

        double Term;
        Term = Sign * InvSqrt * LnSq;


        Sum = Sum + Term;
    }


    double Coeff;
    Coeff = Sum / 2.0;
    printf("%0.14f \n", Coeff);

    return 0;
}

pypypy代码(更快的Python实现):

from math import log, sqrt

Sum = 0

for n in range(2, 1000000000):
    Sum += ((-1)**(n % 2) * (log(n))**2) / sqrt(n)

print(Sum / 2)

Tags: 代码logforincludemathsqrtdoublesum
2条回答

除了编译器的优化级别之外,您还可以改进代码:

int main()
{
    double Sum = 0.0;
    long n;
    for(n = 2; n < 1000000000; ++n)
    {
        double N = n; // cast is implicit, only for code readability, no effect on runtime!

        double Sqrt = sqrt(N);

        //double InvSqrt;     // spare that:
        //InvSqrt = 1.0/Sqrt; // you spare this division with!

        double Ln = log(N);
        double LnSq;
        //LnSq = pow(Ln,2.0);
        LnSq = Ln*Ln; // more efficient

        double Term;
        //Term = Sign * InvSqrt * LnSq;
        Term = LnSq / Sqrt;

        if(n % 2)
            Term = -Term; // just negating, no multiplication
                          // (IEEE provided: just one bit inverted)

        Sum = Sum + Term;
    }
// ...

现在我们可以进一步简化代码:

int main()
{
    double Sum = 0.0;
    for(long n = 2; n < 1000000000; ++n)
    //  ^^^^ possible since C99, better scope, no runtime effect  
    {
        double N = n;
        double Ln = log(N);
        double Term = Ln * Ln / sqrt(N);

        if(n % 2)
            Sum -= Term;
        else
            Sum += Term;
    }
// ...

这一点也不奇怪,PyPy默认情况下会执行大量的运行时优化,而默认情况下,C编译器不会执行任何优化。戴夫·比兹利的2012 PyCon Keynote非常明确地阐述了这一点,并对为什么会发生这种情况提供了深刻的解释。你知道吗

根据引用的谈话,C在使用optimization level23编译时应超过PyPy(您可以在cpythonpypyC开始here中观看fibonacci生成性能的完整部分)。你知道吗

相关问题 更多 >