1

我想处理一个元素列表ls,每个元素在字典中可能有也可能没有相应的元素d。我可以想到两种方法来做到这一点。这里,s是所有作为 键的元素的集合d。在构造时,构造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语句进行测试会比使用异常慢?

4

1 回答 1

4

如果顺序无关紧要,请使用交叉点:

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

process()无论如何,您的大部分时间都可能会花在上面,所以不要进行微优化。而是优化可读性(在合理范围内)。

至于in测试与异常处理的选择:如果未命中的数量较少(相对较少的异常),异常处理会更快,但如果未命中很多,则in测试将比处理大量异常更快。如果您真的在乎,请使用该 timeit模块找到平衡点。在 Programmers.SE 上查看我对这个主题的回答

于 2012-12-22T22:02:14.517 回答