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存在,则追加新条目,否则,创建密钥并添加第一个元素.
这种模式的最快实现是什么?
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.