Python中异常处理程序的成本

Python中异常处理程序的成本,python,performance,exception,micro-optimization,Python,Performance,Exception,Micro Optimization,在中,公认的答案建议用try/except块替换Python代码中的(非常便宜的)if语句,以提高性能 撇开编码风格问题不谈,假设从未触发异常,有一个异常处理程序(性能方面)与没有异常处理程序、与比较零if语句有多大区别?为什么不使用?这样,您就可以看到它是否与您的应用程序相关 好的,我刚刚尝试了以下方法: import timeit statements=["""\ try: b = 10/a except ZeroDivisionError: pass""", """\ i

在中,公认的答案建议用try/except块替换Python代码中的(非常便宜的)if语句,以提高性能


撇开编码风格问题不谈,假设从未触发异常,有一个异常处理程序(性能方面)与没有异常处理程序、与比较零if语句有多大区别?

为什么不使用?这样,您就可以看到它是否与您的应用程序相关

好的,我刚刚尝试了以下方法:

import timeit

statements=["""\
try:
    b = 10/a
except ZeroDivisionError:
    pass""",
"""\
if a:
    b = 10/a""",
"b = 10/a"]

for a in (1,0):
    for s in statements:
        t = timeit.Timer(stmt=s, setup='a={}'.format(a))
        print("a = {}\n{}".format(a,s))
        print("%.2f usec/pass\n" % (1000000 * t.timeit(number=100000)/100000))
结果:

a = 1
try:
    b = 10/a
except ZeroDivisionError:
    pass
0.25 usec/pass

a = 1
if a:
    b = 10/a
0.29 usec/pass

a = 1
b = 10/a
0.22 usec/pass

a = 0
try:
    b = 10/a
except ZeroDivisionError:
    pass
0.57 usec/pass

a = 0
if a:
    b = 10/a
0.04 usec/pass

a = 0
b = 10/a
ZeroDivisionError: int division or modulo by zero
因此,正如预期的那样,没有任何异常处理程序会稍微快一点(但当异常发生时会在脸上爆炸),并且只要不满足条件,
try/except
比显式
if
快一点


但这一切都在同一个数量级内,无论哪种方式都不太重要。只有在实际满足条件的情况下,
if
版本的速度才明显更快。

这个问题实际上在以下章节中得到了回答:

如果没有引发异常,则try/except块非常有效。 事实上,捕捉异常是昂贵的


这个问题有误导性。如果假设从未触发异常,则两种代码都不是最佳代码

如果您假设异常是作为错误条件的一部分触发的,那么您已经超出了需要最佳代码的范围(而且您可能没有在这样的细粒度级别上处理它)


如果您将异常作为标准控制流的一部分使用(这是python的“请求原谅,而不是许可”方式),那么将触发异常,并且成本取决于异常的类型、如果的类型以及您估计异常发生的时间百分比。

有趣。所以
try/except
如果a!=0
Ahh,一个很好的选择:“它都在同一个数量级内”。。。我怀疑许多避免异常的人都希望异常的速度能达到10倍。用python 2.7.5在我的Fedora上运行代码表明,当a=1时,“if”版本(0.08 usec/pass)比“try/except”版本(0.11 usec/pass)快。@duleshi。我想知道这是不是x86/x64的东西?或者可能是不同的处理器扩展?当你测量它时,你学到了什么?相关问题:如果控制到除外部分的机会较少,则使用try/except,如果机会较多,则使用if/else。我只是想知道“极其有效”的效率有多高。很明显,这比一个非常简单的“如果”的声明要快。你发布的摘录来自。也许“非常有效”的意思?