gpt4 book ai didi

Python 常见问题解答 : “How fast are exceptions?”

转载 作者:太空狗 更新时间:2023-10-29 17:13:50 25 4
gpt4 key购买 nike

我只是在看 Python 常见问题解答,因为它在另一个问题中被提及。以前从未真正详细看过它,我偶然发现了this question :“异常有多快?”:

A try/except block is extremely efficient. Actually catching an exception is expensive. In versions of Python prior to 2.0 it was common to use this idiom:

try:
value = mydict[key]
except KeyError:
mydict[key] = getvalue(key)
value = mydict[key]

我对“捕捉异常代价高昂”这部分感到有点惊讶。这是仅指那些您实际将异常保存在变量中的 except 情况,还是通常指所有 except(包括上面示例中的那个)?

我一直认为使用所示的这些习语会非常 pythonic,尤其是在 Python 中 “请求宽恕比获得许可更容易”。 SO 上的许多答案通常也遵循这个想法。

捕获异常的性能真的那么差吗?在这种情况下,是否应该遵循 LBYL(“三思而后行”)?

(请注意,我不是直接谈论常见问题解答中的示例;还有许多其他示例,您只是查找异常而不是之前检查类型。)

最佳答案

捕获异常昂贵的,但异常应该异常(exception)(阅读,不会经常发生)。如果异常很少见,try/catch 比 LBYL 更快。

以下示例在键存在和不存在时使用异常和 LBYL 对字典键查找进行计时:

import timeit

s = []

s.append('''\
try:
x = D['key']
except KeyError:
x = None
''')

s.append('''\
x = D['key'] if 'key' in D else None
''')

s.append('''\
try:
x = D['xxx']
except KeyError:
x = None
''')

s.append('''\
x = D['xxx'] if 'xxx' in D else None
''')

for i,c in enumerate(s,1):
t = timeit.Timer(c,"D={'key':'value'}")
print('Run',i,'=',min(t.repeat()))

输出

Run 1 = 0.05600167960596991       # try/catch, key exists
Run 2 = 0.08530091918578364 # LBYL, key exists (slower)
Run 3 = 0.3486251291120652 # try/catch, key doesn't exist (MUCH slower)
Run 4 = 0.050621117060586585 # LBYL, key doesn't exist

当通常情况也不异常(exception)时,try/catch 与 LBYL 相比“非常高效”。

关于Python 常见问题解答 : “How fast are exceptions?” ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8107695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com