检查字典中的成员资格:例外还是设置?

时间:2012-12-22 21:57:22

标签: python dictionary set

我想处理一个元素列表ls,每个元素可能有也可能没有字典d中的对应元素。我可以想到两种方法。这里,sd键的所有元素的集合。在构建d时,构建s也是微不足道的,因此请将其视为给定。

for e in ls:
    if e in s:
        process(d[e])

for e in ls:
    try:
        process(d[e])
    except KeyError:
        pass

这两个中哪个更快?此外,我听说Python使用“请求宽恕,而不是许可”的原则。这是否意味着通常使用if语句进行测试会比使用异常慢?

1 个答案:

答案 0 :(得分:4)

如果订单无关紧要,请使用交叉点:

for e in s.intersection(ls):
    # only elements that are in `s` *and* `ls` are iterated over
    process(d[e])

在任何情况下,你的大部分时间都可能用在process(),所以不要进行微观优化。而是优化可读性(在合理范围内)。

至于in测试与异常处理的选择:如果未命中数量较少(相对较少的例外),异常处理会更快,但如果你有很多未命中{{1}测试将比处理异常负载更快。如果您真的在意,请使用timeit module查找余额。请参阅my answer on the subject on Programmers.SE