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文档指出——
Easier to ask for forgiveness than permission. This common Python coding style assumes the existence of valid keys or attributes and catches exceptions if the assumption proves false. This clean and fast style is characterized by the presence of many try and except statements. The technique contrasts with the LBYL style common to many other languages such as C.
根据我们的评估,我们得出以下结论。让我们考虑上面的例子,如果我们预计 99% 的情况下 'value' 的值不会等于 0,我们可以使用 try/except 方法。如果异常确实是异常的,它会更快。如果 value 变为 0 的可能性超过 50%,那么使用 'if' 可能会更好。