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可以通过索引直接引用本地,因此不需要哈希表查找.
另外,请注意,这是一个如此简单的测试,您真正要做的是对一些任意字节码操作进行基准测试.
归档时间: |
|
查看次数: |
1610 次 |
最近记录: |