python - 哪个更快:添加键值对或检查键是否存在?
问题描述
想象一个包含 3 列的 CSV 文件:个人名称、组名、组 ID。显然,每行的第 1 列都不同,而第 2 列和第 3 列可以与以前相同(尽管每个组名都有一个单独的 ID)。这不是以任何方式排序的。
出于某种原因,我创建了一个要保存的字典:组 ID(键)-> 组名(值)。现在,以下变体中哪个更快?
检查该密钥是否已经存在,如果不存在则仅保存。
if ID not in group_dict: group_dict[ID] = name
只是每次都保存它(替换值,无论如何都是一样的)。
group_dict[ID] = name
解决方案
当您有这样的问题时,最好对代码进行分析。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 开始表现更好。这里的要点是,您拥有的碰撞次数将决定这些方法中的哪一种更可取。
推荐阅读
- python - 如何用 *args 编写 if 语句?
- html - HTML空格问题
- javascript - 如何修复拆分属性,给出未定义的
- c# - 在 C# 中创建和填充数组的函数式方法
- c - 在用户定义函数的 if() 语句中使用 strcmp 不会返回预期的输出
- linux - 在 CentOS 云上构建原生钠失败
- python - Spark“sum”命令给出方法 sum([class java.util.ArrayList]) 不存在
- firebase - 验证码获取不到现有号码?
- java - 尝试在命令行上运行 Java Spark 应用程序时出现 NoClassDefFoundError
- python - 如何教keras神经网络解决sqrt