首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python if与try-except

Python if与try-except
EN

Stack Overflow用户
提问于 2010-10-14 11:21:11
回答 7查看 12.5K关注 0票数 25

我想知道为什么在下面的程序中try-except比if慢。

代码语言:javascript
复制
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()

我得到的结果很有趣。

代码语言:javascript
复制
Testing Try
2.91111302376
Testing If
0.30621099472

有谁能解释一下为什么尝试的速度要慢得多?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-10-14 11:33:13

您只设置了一次alist。第一次调用"tryway“会将其清除,然后每个后续调用都不会执行任何操作。

代码语言:javascript
复制
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
票数 44
EN

Stack Overflow用户

发布于 2010-10-14 11:46:12

在大多数语言中,异常处理通常很慢。大多数编译器、解释器和VM(支持异常处理)将异常(语言习惯用法)视为异常(不常见)。性能优化涉及到权衡,快速创建异常通常意味着语言的其他方面将受到影响(无论是在性能上还是在设计的简单性上)。

在更高的技术层面上,异常通常意味着VM/解释器(或运行时执行库)必须保存一堆状态,并开始提取函数调用堆栈上的所有状态(称为展开),直到找到有效的捕获(异常)为止。

或者从不同的角度来看,当发生异常时,程序停止运行,并由“调试器”接管。此调试器在堆栈(调用函数数据)中搜索匹配异常的catch。如果它找到了一个,它就会清理掉所有东西,并在那个时候把控制权还给程序。如果没有找到,则将控制权返回给用户(可能以交互式调试器或python REPL的形式)。

票数 3
EN

Stack Overflow用户

发布于 2010-10-14 11:59:50

如果你真的对速度感兴趣,你的两位参赛者都可以减肥。

while True:while 1:慢-- True是一个被加载和测试的全局“变量”;1是一个常量,编译器执行测试并发出一个无条件跳转。

while True:在ifway中是多余的。将while/if/break合并在一起:while alist != []:

while alist != []:是编写while alist:的一种缓慢的方式

试试这个:

代码语言:javascript
复制
def tryway2():
    alist = range(1000)
    try:
        while 1:
            alist.pop()
    except IndexError:
        pass

def ifway2():
    alist = range(1000)
    while alist:
        alist.pop()

`

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3929837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档