当前位置: 首页 > 面试题库 >

Python常见问题解答:“异常有多快?”

商琛
2023-03-14
问题内容

我只是在查看Python
FAQ,因为它是另一个问题中提到的。以前从未真正详细地研究过它,我遇到了一个问题:“例外情况有多快?”:

try / except块非常有效。实际上捕获异常是昂贵的。在2.0之前的Python版本中,通常使用以下习惯用法:

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

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

我一直认为,使用所示的惯用法是非常Python的,尤其是在Python中, “获得宽容比获得Permission更为容易”
。SO上的许多答案通常也遵循此想法。

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

(请注意,我并不是直接从FAQ中谈论示例;在许多其他示例中,您只是在寻找异常而不是在之前检查类型。)


问题答案:

捕获异常 非常 昂贵,但是异常应该是 例外的 (读取,不经常发生)。如果例外情况很少,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

当通常情况也不例外try/catch时,与LBYL相比是“极其有效”的。



 类似资料:
  • 问1:INSERT/UPDATE/DELETE被解析为Query或DDL语句? 答1: 出现这类情况主要原因为收到的binlog就为Query事件,比如: binlog格式为非row模式,通过show variables like 'binlog_format'可以查看. 针对statement/mixed模式,DML语句都会是以SQL语句存在 mysql5.6+之后,在binlog为row模式下

  • 本页面罗列了大家使用 YApi 时遇到的常见问题. 如果没有找到您要的答案,请联系管理员. Q1 怎样联系组长? 组长分为 分组组长 和 项目组长: 分组组长:选择首页左侧的分组,点击右侧面板的 成员列表,成员右侧显示着 组长/开发者 的权限信息。 项目组长: 点击项目页的 设置 - 成员列表,成员右侧显示着 组长/开发者 的权限信息。 Q2 怎么快速迁移旧项目? 第一步. 使用 Chrome 浏

  • 译者:冯宝宝 我的模型报告“cuda runtime error(2): out of memory” 正如错误消息所示,您的GPU显存已耗尽。由于经常在PyTorch中处理大量数据,因此小错误会迅速导致程序耗尽所有GPU资源; 幸运的是,这些情况下的修复通常很简单。这里有一些常见点需要检查: 不要在训练循环中积累历史记录。 默认情况下,涉及需要梯度计算的变量将保留历史记录。这意味着您应该避免在计

  • 版本 Unity2018.3以上需要用最新ILRuntime。 最新的发布版本为V2.0,Unity2018以上可通过Package Manager方式安装 V1.4已过时,示例工程内的版本已过时,当前最新版本为master分支。 ILRuntime的性能到底怎么样 最新版ILRuntime在若干若干测试用例中,包括大规模数值计算的场景,均已超过Lua53版xlua,详细测试可参考 U3D Dem

  • 1.Q:导出的PPT是否支持动态图表?做的图表能否动态导入PPT或word中? A:不支持, 动态交互性图表是由代码组成,浏览器内核才能解析。图表秀有office插件,可以支持PPT中插入动态图表,可以参考帮助文档“如何在PPT中插入图表”。 2.Q:图表的颜色能否修改? A:在图表编辑工具中可以设置单个图表的颜色。在图册中图表颜色是在主题色系中,通过切换系统主题或者自定义主题就可以修改图表颜色。

  • 如何引用 Keras? 如何在 GPU 上运行 Keras? 如何在多 GPU 上运行 Keras 模型? "sample", "batch", "epoch" 分别是什么? 如何保存 Keras 模型? 为什么训练集误差比测试集的误差高很多? 如何获取中间层的输出? 如何用 Keras 处理超过内存的数据集? 在验证集的误差不再下降时,如何中断训练? 验证集划分是如何计算的? 在训练过程中数据是