我有一个项目,我必须经常这样做:
if "something" in dict:
some_var = dict["something"]
del dict["something"]
else:
error_handler_or_other_stuff()
但我有想法使用它:
try:
some_var = dict.pop("something")
except KeyError:
error_handler_or_other_stuff()
我的问题是:一般来说,如何“快速”尝试 - 除了构造是处理异常?是否可以使用它,或者“手动”执行这些操作仍然更快。有时我也有这种情况,我必须将值转换为整数:
try:
some_var = int(dict.pop("something"))
except KeyError:
error_handler_or_other_stuff("no such key")
except ValueError:
error_handler_or_other_stuff("bad value for key")
现在有异常的解决方案似乎相当不错,因为我可以一步完成两个检查,同时我从dict中删除了原始的键/值对,这是问题的一部分。所以我至少可以说:它看起来像一个优雅的解决方案。但是我不确定它是否更快,或者它是否有其他缺点我应该担心。
答案 0 :(得分:5)
哪种构造使您的代码更易于理解和维护?选择那个。
如果生成的代码太慢,请返回并考虑不同的错误处理策略是否更有效。
答案 1 :(得分:4)
答案 2 :(得分:3)
例外不是特别慢。显然,在异常处理方面比在简单的if中有更多的事情发生,但除非你每秒执行一百万次,否则速度差异可以忽略不计。
你的例子是如此微不足道,以至于没有理由担心速度开始。像这样的微优化只需花费更多的时间来思考它们,而不是使用它们进行保存。
你给出的代码绝对没问题,那就是有什么例外。
答案 3 :(得分:3)
使用 timeit 模块可以轻松回答这些性能问题:
setup = '''
d = {'a': 1}
k = 'b'
'''
LBYL = '''
if k in d:
pass
else:
pass
'''
EAPF = '''
try:
d[k]
except KeyError:
pass
'''
from timeit import Timer
print min(Timer(LBYL, setup).repeat(7, 1000000))
print min(Timer(EAPF, setup).repeat(7, 1000000))
结果显示if / else方法为0.0546,try / except方法为1.3370。后者比前者慢约25倍。
话虽这么说,你通常应该用任何表达最清晰代码的东西。
Sidenote :这两种方法为 dict 的子类提供了不同的答案,这些子类定义 缺少 以返回值