请参见Is there something wrong with this python code, why does it run so slow compared to 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
在红宝石里是
#!/usr/bin/ruby
i = 0
a = 0
while i < 6553500
i += 1
if i != 6553500
a = i
else
print "o"
end
end
print a
巨蟒3.1.2(r312:791472010年10月4日,12:45:09)
[GCC 4.5.1]关于Linux2
时间python pytest.py
o
六百五十五万三千四百九十九
实际0m3.637s
用户0m3.586s
Ruby 1.9.2p0(2010-08-18版本29036)[x86_64-Linux]
时间红宝石rutest.rb
O655
实0m0.618s
用户0m0.610s
让它更高的循环会产生更大的差异。添加一个额外的0,ruby将在7秒内完成,而python将在40秒内完成。
它运行在Intel(R)Core(TM)i7 CPU M 620@2.67GHz上,内存为4GB。
为什么会这样?
最佳答案
首先,请注意您显示的python版本不正确:这段代码是在python 2.7中运行的,而不是在3.1中运行的(它甚至不是有效的python3代码)。(仅供参考,python 3通常比2慢。)
也就是说,在python测试中有一个关键问题:您将它作为全局代码编写。你需要把它写成一个函数。在python 2和python 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()
全局编写代码时,没有局部变量;所有变量都是全局变量。局部变量比python中的全局变量快得多,因为全局变量存储在
dict
中。vm可以通过索引直接引用局部变量,因此不需要哈希表查找。另外,请注意,这是一个非常简单的测试,您真正要做的是对一些任意字节码操作进行基准测试。