首页 > 解决方案 > 哪个更快:添加键值对或检查键是否存在?

问题描述

想象一个包含 3 列的 CSV 文件:个人名称、组名、组 ID。显然,每行的第 1 列都不同,而第 2 列和第 3 列可以与以前相同(尽管每个组名都有一个单独的 ID)。这不是以任何方式排序的。

出于某种原因,我创建了一个要保存的字典:组 ID(键)-> 组名(值)。现在,以下变体中哪个更快?

  1. 检查该密钥是否已经存在,如果不存在则仅保存。

    if ID not in group_dict:
       group_dict[ID] = name 
    
  2. 只是每次都保存它(替换值,无论如何都是一样的)。

    group_dict[ID] = name 
    

标签: pythonpython-3.xdictionaryif-statement

解决方案


当您有这样的问题时,最好对代码进行分析。Python 提供了timeit用于此目的的模块。这是一些您可以用来试验的代码,

import timeit

setup_code = """
import random

keysize = 20
valsize = 32
store = dict()
data = [(random.randint(0, 2**keysize), random.randint(0, 2**valsize)) for _ in range(1000000)]

"""

query = """
for key, val in data:
    if key not in store:
        store[key] = val
"""

no_query = """
for key, val in data:
    store[key] = val
"""


if __name__ == "__main__":
    print(timeit.timeit(stmt=query, setup=setup_code, number=1))
    print(timeit.timeit(stmt=no_query, setup=setup_code, number=1))

代码的性能取决于密钥冲突的数量。在这段代码中,如果增加keysize,碰撞次数会更少,并且首先检查字典会更慢。相反,如果你减少keysize冲突的数量会增加并且检查 dict 开始表现更好。这里的要点是,您拥有的碰撞次数将决定这些方法中的哪一种更可取。


推荐阅读