我想知道为什么在下面的程序中try-except比if慢。
def tryway():
try:
while True:
alist.pop()
except IndexError:
pass
def ifway():
while True:
if alist == []:
break
else:
alist.pop()
if __name__=='__main__':
from timeit import Timer
alist = range(1000)
print "Testing Try"
tr = Timer("tryway()","from __main__ import tryway")
print tr.timeit()
print "Testing If"
ir = Timer("ifway()","from __main__ import ifway")
print ir.timeit()我得到的结果很有趣。
Testing Try
2.91111302376
Testing If
0.30621099472有谁能解释一下为什么尝试的速度要慢得多?
发布于 2010-10-14 11:33:13
您只设置了一次alist。第一次调用"tryway“会将其清除,然后每个后续调用都不会执行任何操作。
def tryway():
alist = range(1000)
try:
while True:
alist.pop()
except IndexError:
pass
def ifway():
alist = range(1000)
while True:
if alist == []:
break
else:
alist.pop()
if __name__=='__main__':
from timeit import Timer
print "Testing Try"
tr = Timer("tryway()","from __main__ import tryway")
print tr.timeit(10000)
print "Testing If"
ir = Timer("ifway()","from __main__ import ifway")
print ir.timeit(10000)
>>> Testing Try
>>> 2.09539294243
>>> Testing If
>>> 2.84440898895发布于 2010-10-14 11:46:12
在大多数语言中,异常处理通常很慢。大多数编译器、解释器和VM(支持异常处理)将异常(语言习惯用法)视为异常(不常见)。性能优化涉及到权衡,快速创建异常通常意味着语言的其他方面将受到影响(无论是在性能上还是在设计的简单性上)。
在更高的技术层面上,异常通常意味着VM/解释器(或运行时执行库)必须保存一堆状态,并开始提取函数调用堆栈上的所有状态(称为展开),直到找到有效的捕获(异常)为止。
或者从不同的角度来看,当发生异常时,程序停止运行,并由“调试器”接管。此调试器在堆栈(调用函数数据)中搜索匹配异常的catch。如果它找到了一个,它就会清理掉所有东西,并在那个时候把控制权还给程序。如果没有找到,则将控制权返回给用户(可能以交互式调试器或python REPL的形式)。
发布于 2010-10-14 11:59:50
如果你真的对速度感兴趣,你的两位参赛者都可以减肥。
while True:比while 1:慢-- True是一个被加载和测试的全局“变量”;1是一个常量,编译器执行测试并发出一个无条件跳转。
while True:在ifway中是多余的。将while/if/break合并在一起:while alist != []:
while alist != []:是编写while alist:的一种缓慢的方式
试试这个:
def tryway2():
alist = range(1000)
try:
while 1:
alist.pop()
except IndexError:
pass
def ifway2():
alist = range(1000)
while alist:
alist.pop()`
https://stackoverflow.com/questions/3929837
复制相似问题