最佳实践:我应该在Python代码中大量使用异常处理程序,还是应该避免使用';有可能吗?

最佳实践:我应该在Python代码中大量使用异常处理程序,还是应该避免使用';有可能吗?,python,exception,Python,Exception,我有一个项目,我必须经常这样做: 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() 我

我有一个项目,我必须经常这样做:

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-except构造处理异常的“速度”有多快?大量使用它可以吗?或者“手动”做这些事情更快。有时我还需要将值转换为整数:

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中删除了原始的键/值对,这也是问题的一部分。所以我至少可以说:这看起来是一个优雅的解决方案。但是,我不确定它是否更快,或者它是否有其他我应该担心的缺点。

为什么不使用或使用
默认参数?

哪种结构使代码更易于理解和维护?选那个


如果结果代码太慢,则返回并考虑不同的错误处理策略是否更有效。

异常不是特别慢。显然,异常处理比简单的if处理要复杂得多,但除非每秒执行一百万次,否则速度差异可以忽略不计

您的示例非常琐碎,没有理由担心开始时的速度。像这样的微优化只需考虑它们就要花费比使用它们所能节省的时间更多的时间


您给出的代码非常好,这就是存在异常的原因。

使用timeit模块可以轻松回答此类性能问题:

结果显示,if/else方法为0.0546,try/except方法为1.3370。后者的速度大约是前者的25倍

也就是说,您通常应该使用表示最清晰代码的内容


旁注:这两种方法对定义缺失以返回值的dict子类给出了不同的答案。

+1即使文档中说
请求原谅比允许更容易
。有时这根本没有意义。在他的例子中,他在检索dict时从dict中删除项目。测量结果表明,异常处理比同等的if-else方法要慢得多。当然,这是否有区别取决于你打电话的次数。
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))