为什么python比Ruby更慢,即使这个非常简单的"测试"呢?

rap*_*ura 2 ruby python testing performance

看看这个python代码有什么问题,为什么它与ruby相比运行得如此之慢?我之前尝试理解python和ruby之间的差异.

正如igouy所指出的那样,我想出的python速度较慢的原因可能是其他原因而不是由于递归函数调用(涉及堆栈).

我做的

#!/usr/bin/python2.7
i = 0
a = 0
while i < 6553500:
    i += 1
    if i != 6553500:
       a = i 
    else:
        print "o" 
print a 
Run Code Online (Sandbox Code Playgroud)

在红宝石中它是

#!/usr/bin/ruby
i = 0
a = 0
while i < 6553500
    i += 1
    if i != 6553500
       a = i 
    else
        print "o"
    end
end   
print a
Run Code Online (Sandbox Code Playgroud)

在Linux2上的Python 3.1.2(r312:79147,2010年10月4日,12:45:09)[GCC 4.5.1]

时间python pytest.py o

6553499

真正的0m3.637s

用户0m3.586s

ruby 1.9.2p0(2010-08-18修订版29036)[x86_64-linux]时间ruby rutest.rb

o6553499

真正的0m0.618s

用户0m0.610s

让它循环越高会产生更大的差异.添加额外的0,ruby在7s完成,而python运行40s.

这是在Intel(R)Core(TM)i7 CPU M 620 @ 2.67GHz上运行,具有4GB内存.

为什么会这样?

Gle*_*ard 16

首先,请注意您显示的Python版本不正确:您在Python 2.7中运行此代码,而不是3.1(它甚至不是有效的Python3代码).(仅供参考,Python 3通常比2慢.)

也就是说,Python测试中存在一个关键问题:您将其编写为全局代码.你需要把它写成一个函数.在Python 2和3中正确编写时,它的运行速度大约是其两倍:

def main():
    i = 0
    a = 0
    while i < 6553500:
        i += 1
        if i != 6553500:
           a = i
        else:
            print("o")
    print(a)

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

当你全局编写代码时,你没有本地人; 所有变量都是全局变量.在Python中,locals比globals快得多,因为全局变量存储在一个dict.VM可以通过索引直接引用本地,因此不需要哈希表查找.

另外,请注意,这是一个如此简单的测试,您真正要做的是对一些任意字节码操作进行基准测试.

  • @AntonioP:这不是问题所在,但就像任何语言一样:阅读教程和文档,阅读和编​​辑大量代码.并且:不要仅根据性能选择高级语言.Python在动态类型的语言类别中非常快,但是如果你看到它就会错过它的真实特征集 - 理解,生成器函数和表达式,迭代器,一流函数,内省,上下文管理器,函数和类装饰器,更不用说标准库了. (7认同)
  • 就是这种情况,正如安东尼奥提到的那样,功能并没有救他.你不喜欢我的答案,但它主要是关于:"为什么ruby可以比python更快?".我试图完全回答,不仅仅是关于这个测试程序,并且不需要解释每一个程序,这将给作者提供相同的声音. (2认同)