我想处理一个元素列表 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
语句会比使用异常慢?
最佳答案
如果顺序无关紧要,请使用交集:
for e in s.intersection(ls):
# only elements that are in `s` *and* `ls` are iterated over
process(d[e])
在任何情况下,您的大部分时间都可能花在 process()
上,所以不要进行微优化。而是优化可读性(在合理范围内)。
至于 in
测试与异常处理的选择:如果未命中数较低(异常相对较少),异常处理会更快,但如果未命中很多 in
测试将比处理大量异常更快。如果您真的关心,请使用 timeit
module找到一个平衡点。参见 my answer on the subject on Programmers.SE .
关于python - 检查字典 : exceptions or set? 中的成员资格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14006906/