📜  Python中的try-except vs If

📅  最后修改于: 2022-05-13 01:55:51.368000             🧑  作者: Mango

Python中的try-except vs If

Python是一种广泛使用的通用高级编程语言。它主要是为了强调代码的可读性而开发的,它的语法允许程序员用更少的代码行来表达概念。 Python是一种编程语言,可让您快速工作并更有效地集成系统。
大多数人不知道 Try-Except 块可以替代 if-else(条件语句)。是的,你没有看错!可以办到。我们可以使用 Try(异常处理)而不是使用普通的条件语句。

这是一个非常有名的例子:
使用如果:

if key in mydict:
    mydict[key] += 1
else:
    mydict[key] = 1

使用尝试/除外:

try:
    mydict[key] += 1
except KeyError:
    mydict[key] = 1

看起来棒极了!但问题来了,哪个代码块运行得更快?
它可以使用Python中的 timeit 模块来测量。可以看出是否应该使用 Try 块而不是 If。
示例:使用 try-except 和 if-else 对 2 个数字进行除法的时间比较。
下面是实现。

Python3
import timeit
 
code_snippets =["""\
try:
    result = 1000 / value
except ZeroDivisionError:
    pass""",
"""\
if value:
    result = 1000 / value""",
]
 
for value in (1, 0):
    for code in code_snippets:
        t = timeit.Timer(stmt = code, setup ='value ={}'.format(value))
        print("----------------------")
        print("value = {}\n{}".format(value, code))
        print("%.2f usec / pass\n" % (1000000 * t.timeit(number = 100000)/100000))


输出:

----------------------
value = 1
try:
    result = 1000 / value
except ZeroDivisionError:
    pass
0.04 usec / pass

----------------------
value = 1
if value:
    result = 1000 / value
0.06 usec / pass

----------------------
value = 0
try:
    result = 1000 / value
except ZeroDivisionError:
    pass
0.37 usec / pass

----------------------
value = 0
if value:
    result = 1000 / value
0.01 usec / pass

现在可以清楚地看到,在遇到异常之前,异常处理程序(try/except)比显式 if 条件要快得多。这意味着如果抛出任何异常,异常处理程序会比 if 版本的代码花费更多的时间。这意味着决定代码速度的因素是正在处理的问题的类型。
我们经常听到Python总是鼓励EAFP (“请求宽恕比请求许可”)风格,而不是LBYL (“在你跳跃之前”)风格,在大多数语言(如 C)中使用Python文档指出——

根据我们的评估,我们得出以下结论。让我们考虑上面的例子,如果我们预计 99% 的情况下 'value' 的值不会等于 0,我们可以使用 try/except 方法。如果异常确实是异常的,它会更快。如果 value 变为 0 的可能性超过 50%,那么使用 'if' 可能会更好。