Python字典中的'in'子句每次都会调用keys()函数吗?

5 投票
5 回答
1510 浏览
提问于 2025-04-16 11:02

假设我有一个

dict = {...} #lots of words in dictionary  

我需要做一个

for word in ...: #long list of words
    if word in dict:
        #do something

我的问题是,使用 'if word in dict' 这个写法每次都会调用 dict.keys() 函数吗?这样会不会比我在前面加一个变量 dict_keys = dict.keys() 要慢很多?我说的结果是这个。

dict = {...}
dict_keys = dict.keys()

for word in ...:
    if word in dict_keys:
        #do something

谢谢

5 个回答

2

简单来说:不是的,更像是 __contains__,它的效率是 O(1)(也就是说,执行起来很快)。

5

其实,内置的字典(dict)会直接调用它的 __contains__ 方法,这个方法会直接运行一个叫 dict_has_key 的C语言函数,这个函数非常快。所以,第一种方法更好,因为它不需要你去检查字典里所有的键,而调用 keys() 方法就会这样做。

11

不,foo in mydict 实际上要快很多,比 foo in keys_list 要快。这是因为 dict 是一种哈希表,查找里面的元素是 O(1),也就是说,无论里面有多少个元素,查找的时间基本上是固定的。而 foo in keys_list 的查找时间是 O(n),也就是说,随着元素数量的增加,查找的时间会变得更慢。

不过你可以自己测试一下:

$ python -m timeit -s "x = range(1000)" "15 in x"
1000000 loops, best of 3: 0.311 usec per loop
$ python -m timeit -s "x = dict.fromkeys(xrange(1000))" "15 in x"
10000000 loops, best of 3: 0.0515 usec per loop

所以直接在 dict 中检查1000个元素的速度要快一个数量级,不考虑 .keys() 的时间。

撰写回答