我想处理一个元素列表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
语句进行测试会比使用异常慢?
答案 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。