为何Python字典中`in`关键字比`.get()`检查键存在更快?
好问题!这事儿得从Python字典的底层实现说起,咱们一步步理清楚:
为什么in检查字典键更快?
Python字典本质是哈希表(Hash Table),这是它和列表最核心的区别:
- 每个字典键都会被计算出一个唯一的哈希值,这个值直接对应哈希表中的一个存储位置
- 当你用
'some_key' in some_dic时,程序会先算这个键的哈希值,直接定位到对应的槽位,只需要检查这个槽位(最多少数几个,处理哈希冲突的情况)里的键是否匹配,就能得出“存在/不存在”的结论 - 这个过程的平均时间复杂度是O(1),完全不需要遍历整个字典——你说的没错,列表没有哈希映射机制,
element in some_list必须从头挨个遍历,时间复杂度是O(n),数据量大的时候慢很多
.get()为什么稍慢?
.get()方法其实包含了in的查找逻辑,但多做了额外操作:
- 先完成和
in一样的哈希查找 - 如果找到键,会返回对应的值;没找到的话,还要返回默认值(默认是
None)
而in只需要返回布尔值,不需要去获取或返回对应的值——少了这一步,自然更快。
另外还有个坑:如果键对应的是假值(比如0、''、False、None),用.get()的判断逻辑会出错。比如some_dic = {'count': 0},if some_dic.get('count')会返回False,但键明明存在,这时候in就靠谱多了。
举个代码对比:
# 只判断存在性,in更高效且可靠 if 'count' in some_dic: print("键存在!") # .get()会返回值,且假值场景会误判 if some_dic.get('count'): print("键存在?(假值会出错)")
总结一下
in:只做哈希查找+存在性判断,轻量高效,平均O(1),无假值误判风险.get():包含查找+返回值操作,稍慢,且存在假值判断漏洞- 列表的
in:线性遍历,O(n),和字典的哈希机制完全不是一个路子
内容的提问来源于stack exchange,提问作者T K Sourabh
相关产品推荐
相关产品推荐

