python - 检查字典 : exceptions or set? 中的成员资格

标签 python dictionary set

我想处理一个元素列表 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/

相关文章:

python - C++ 扩展中的 DateTime 对象方法出现问题

c++ - 使用静态成员初始化静态映射

java - 具有弱引用和身份哈希的并发集

set - 是否有独立于编程语言的任意集合的通用查询语言?

java - 对集合中的现有对象或传入对象调用 equals() 方法

python - 如何在 Python 2 中求大数的平方根?

python - 智能卡 PKCS11 AES key 生成失败

python - 模块未找到错误 : No module named 'gevent.wsgi'

javascript - 通过点击 map 连接 2 个点

python - 在Python中,给定一个包含值列表的字典,如何根据该列表中的项目数量对字典进行排序?