为什么 Python 在 Raring 上这么慢?

为什么 Python 在 Raring 上这么慢?

为了在我新安装的 13.04 上运行一些基准测试,我用 Python 编写了以下斐波那契脚本。它基本上接受一个数字并开始多次计算斐波那契数:

#!/usr/bin/python
import time
from time import time

def fibo(n):
    a,b,i=0,1,0
    while i<n:
        #print b
        a,b = b,b+a
        i+=1


if __name__ == "__main__":
    s=time()
    fibo(1000000)
    print round((time()-s)*1000,0),"ms"

但是,当使用 100 万作为参数调用 fibo() 函数时,python 似乎挂了。然而,Java 中的类似代码可以立即运行:

class fibonacci
{
    private static void fibo(int n)
    {
        int a=0,b=1,i=0;
        while( i<n)
        {
            //print b
            int t=a;
            a=b;
            b=b+t;
            i++;
        }
    }   

    public static void main(String[] args)
    {
        float s=System.currentTimeMillis();
        fibo(1000000);
        System.out.println( (System.currentTimeMillis()-s) + "ms");
    }
}

这是什么原因?python 本身就这么慢吗?还是我的安装有问题?

答案1

查看你的 Java 代码,我注意到你正在使用int斐波那契数列。另一方面,Python 正在使用任意精度

还要注意的是,斐波那契数列不适合int的变量n > 46!因此 Java 代码甚至不会计算 的斐波那契数列n > 46

int在进行比较之前,您应该将其更改为一些更大的数据类型(可能是任意精度的数据类型)。

结论,Java 运行速度更快,因为它使用 int(固定大小的数据类型)进行计算,而 Python 使用越来越多的 RAM 来累积不断增加的数字(最终不再适合 32 位整数)。

尝试这个:

#!/usr/bin/python
from time import time

def int32(x):
    x &= 0xffffffff
    if x > 0x7fffffff:
        return - ( ~(x - 1) & 0xffffffff )
    else:
        return x

def fibo(n):
    a,b,i=0,1,0
    while i<n:
        t = a
        a = b
        b = int32(b + t)
        i+=1


if __name__ == "__main__":
    s=time()
    fibo(1000000)
    print round((time()-s)*1000,0),"ms"

查看 Python 使用 int 大约需要花费多少时间。

答案2

摘录自http://www.python.org/doc/essays/comparisons.html应该可以回答你的问题。
简短的答案在第一句话里;)

“Python 程序的运行速度通常比 Java 程序慢,但开发时间也短得多。Python 程序通常比同等的 Java 程序短 3-5 倍。这种差异可以归因于 Python 内置的高级数据类型及其动态类型。例如,Python 程序员不会浪费时间声明参数或变量的类型,而 Python 强大的多态列表和字典类型(其丰富的语法支持直接内置在语言中)几乎在每个 Python 程序中都有用处。由于运行时类型,Python 的运行时必须比 Java 更努力。例如,在评估表达式 a+b 时,它必须首先检查对象 a 和 b 以找出它们的类型,而这在编译时是未知的。然后它调用适当的加法运算,这可能是重载的用户定义方法。另一方面,Java 可以执行高效的整数或浮点加法,但需要对 a 和 b 进行变量声明,并且不允许为用户定义类的实例重载 + 运算符。

出于这些原因,Python 更适合作为“胶水”语言,而 Java 更适合作为低级实现语言。事实上,两者结合在一起,形成了一个极好的组合。组件可以用 Java 开发,并组合成 Python 应用程序;Python 还可用于原型化组件,直到它们的设计可以在 Java 实现中“强化”。为了支持这种类型的开发,正在开发一种用 Java 编写的 Python 实现,它允许从 Java 调用 Python 代码,反之亦然。在此实现中,Python 源代码被转换为 Java 字节码(借助运行时库来支持 Python 的动态语义)。”

相关内容