python词典中使用的'in'子句是否每次调用keys()函数?

ape*_*dge 5 python optimization dictionary

比方说我有一个

dict = {...} #lots of words in dictionary  
Run Code Online (Sandbox Code Playgroud)

我必须做一个

for word in ...: #long list of words
    if word in dict:
        #do something
Run Code Online (Sandbox Code Playgroud)

我的问题是,'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
Run Code Online (Sandbox Code Playgroud)

谢谢

nos*_*klo 10

没有.foo in mydict其实快了很多foo in keys_list,因为dicts为哈希表,所以寻找元素里面是O(1).虽然foo in keys_listO(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
Run Code Online (Sandbox Code Playgroud)

因此,直接检查dict1000个元素的速度要快一个数量级,而不考虑时间.keys()


Dan*_*olo 5

实际上,内置的dicts只是调用它们__contains__直接调用dict_has_key非常快的C函数.所以,第一种方式做得更好是因为它不会强迫你像调用keys()那样评估你的dict中的整个键序列.

  • 你的答案有点误导,因为*在C*中并不是dicts更快的原因,因为列表也是用C语言编写的.dict算法是一个哈希表,这才真正使它比检查列表内部更快(不管用于实现它的语言) (4认同)