(令人惊讶的是)python dict“;有“U键”;快于;在;

(令人惊讶的是)python dict“;有“U键”;快于;在;,python,dictionary,Python,Dictionary,从流行信息和网上搜索+stackoverflow来看,“in”在python字典中的键查找速度似乎比“has_key”快。然而,我最近的经历正好相反,我不知道为什么会这样?考虑以下形式的代码: for f in F: if 'A' in f: AList.append(f) #if f in FDICT.keys(): if FDICT.has_key(f): idx_AList.append(FDICT[f])

从流行信息和网上搜索+stackoverflow来看,“in”在python字典中的键查找速度似乎比“has_key”快。然而,我最近的经历正好相反,我不知道为什么会这样?考虑以下形式的代码:

for f in F:
    if 'A' in f:
        AList.append(f)
        #if f in FDICT.keys():
        if FDICT.has_key(f):
            idx_AList.append(FDICT[f])
    elif 'B' in f:
        BList.append(f)
        #if f in FDICT.keys():
        if FDICT.has_key(f):
            idx_BList.append(FDICT[f])

在上面的例子中,切换到“has_key”会使代码速度提高50000x倍,即使在非常小的文件上也是如此。这真是令人费解——有人知道发生了什么吗

它是FDICT中的
f
,而不是FDICT.keys()中的
f
。使用
构建所有键的列表并逐个遍历,而在FDICT中使用
f
则使用高效的基于哈希的查找

if f in FDICT.keys()
因为每次循环时都会生成密钥列表


尝试在fDICT中用
f替换它

这可能是因为您正在调用
fDICT.keys():
,它必须创建一个键列表。您希望在FDICT:中执行
f,该操作具有相同的结果,但不需要生成键列表


在任何情况下,我都听说传统的优化方法是假设密钥在dict中,如果不是

那么就捕获
KeyError
,这并不奇怪;将方法调用替换为方法调用加上运算符,其中方法调用必须首先生成一个新的列表对象。如果你用的是另一方面的接线员……谢谢,如果我昨天看到的话,那会节省我一整天的工作。