更新字典和检查密钥的最快方法

Den*_*niz 2 python performance dictionary append

我正在构建一个非常长的字符串(~1G)的字典,其中key是固定长度的k-mer,值是所有出现位置.当k很大(> 9)时,预先构建k-mer字典是没有意义的,因为并非所有值都会发生并且它会使表膨胀.

目前我正在做这样的任务:

def hash_string(st, mersize):

    stsize = len(st)
    hash = {}
    r = stsize-mersize+1

    for i in range(0, r):
        mer = st[i:i+mersize]
        if mer in hash:
            hash[mer].append(i)
        else:
            hash[mer] = [i]

    return hash

# test for function hash_st above        
mer3 = hash_string("ABCDABBBBBAAACCCCABCDDDD", 3) 
Run Code Online (Sandbox Code Playgroud)

最耗时的步骤(我做过cProfile)是查找遇到的键(当我们沿着字符串移动时),是新键还是已经存在.最快的方法是什么?

(我目前正在测试一个避免这一步骤的两遍策略(这对于大型序列来说要快得多),我首先通过简单地覆盖双打来构建密钥列表.然后我不必检查对于密钥存在 - 我用这些密钥种下我的字典,然后在第二遍时,只要在我遇到它们时附加.)

但是我仍然有兴趣知道,总结一下,在Python中查找dict键的最快方法,因为这是一个常见的模式:

如果key存在,则追加新条目,否则,创建密钥并添加第一个元素.

这种模式的最快实现是什么?

kha*_*hik 8

我会用collections.defaultdict:

import collections
...
hash = collections.defaultdict(list)
r = stsize-mersize+1

for i in range(0, r):
    mer = st[i:i+mersize]
    hash[mer].append(i)
Run Code Online (Sandbox Code Playgroud)

虽然从来没有描述过它if ... else.