微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我需要速度比较两个非常大的字典:键是索引存储为元组的原始熊猫索引,值是字符串列表

如何解决我需要速度比较两个非常大的字典:键是索引存储为元组的原始熊猫索引,值是字符串列表

首先感谢您为我阅读和使用的其他人提供的一千个回答问题。但现在我需要发布我自己的问题。在 4000 行运行良好的代码中,接下来的 6 行需要几周时间,现在需要几天时间,但我仍然需要它来运行得更快。我的一段特别慢的代码

    for i in PepCombDict.items():
        for x in PepSeqDictFull_NoneUnique_NRP.items():
            if x[0] == i[0][0] or x[0] == i[0][1]:
                continue
            elif(set(x[1]).issubset(set(i[1]))):
                subsumablelist.append([i[0][0],i[0][1],x[0]]) 

PepCombDict一个字典,第一个条目如下: 键是一对值:(0,1) 值是列表:

['TVMENFVAFVDK','KVPQVSTPTLVEVSR','DTHKSEIAHR','YICDNQDTISSK','KQTALVELLK','FKDLGEEHFK','EYEATLEECCAK','AEFVEVTK','LVNELTEFAK','LVTDLTK','LGEYGFQNALIVR','LSQKFPK','HLVDEPQNLIK','YLYEIAR','SIVHPSYNSNTLNNDIMLIK','SAYPGQITSNMFCAGYLEGGK','LKSAASLNSR','SAASLNSR','sgiQVR','NKPGVYTK','LGednINVVEGNEQFISASK','SSGTSYPDVLK','APILSDSSCKSAYPGQITSNMFCAGYLEGGK','SIVHPSYNSNTLNNDIMLIKLK']

同理,PepSeqDictFull_NoneUnique_NRP 也是一个字典,第一个条目如下: 键是单个值:9 值为:列表

['VTMQNLNDR','QsveADINglr','QsveADINglrR','LAADDFR','DYSKYYK','SKELTTEIDNNIEQISSYK','KDAEAWFNEK','ISSSKGSLGGGFSSGGFSGGSFSR',.....

代码块的目标是找出所有在 PepSeqDictFull_NoneUnique_NRP 中找到的字符串序列列表是在 PepCombDict 中找到的字符串序列的子集的所有情况;找到后,将键(索引)保存为三个数字(两个键的组合)的列表。

如果有人知道如何使这个过程更快,我将不胜感激。我完全愿意改变任何部分的格式。我在这次大流行中学习了 Python,并想坚持使用 Python。 PepSeqDictFull_NoneUnique_NRP 总是较小。 PepCombDict 的大小范围为 2,000,000 到 100,000。

if x[0] == i[0][0] or x[0] == i[0][1]: continue 只是为了防止一个条目被发现是它自己的一个子集。

最好,

汤姆

解决方法

combs = {
    (0,1): ['TVMENFVAFVDK','KVPQVSTPTLVEVSR','DTHKSEIAHR','YICDNQDTISSK','KQTALVELLK','FKDLGEEHFK','EYEATLEECCAK','AEFVEVTK','LVNELTEFAK','LVTDLTK','LGEYGFQNALIVR','LSQKFPK','HLVDEPQNLIK','YLYEIAR','SIVHPSYNSNTLNNDIMLIK','SAYPGQITSNMFCAGYLEGGK','LKSAASLNSR','SAASLNSR','SGIQVR','NKPGVYTK','LGEDNINVVEGNEQFISASK','SSGTSYPDVLK','APILSDSSCKSAYPGQITSNMFCAGYLEGGK','SIVHPSYNSNTLNNDIMLIKLK']
}

seqs = {
    9: ['VTMQNLNDR','QSVEADINGLR','QSVEADINGLRR','LAADDFR','DYSKYYK','SKELTTEIDNNIEQISSYK','KDAEAWFNEK','ISSSKGSLGGGFSSGGFSGGSFSR']
}

As @TomKarzes noted,您可以在循环外创建集合:

combs = {k: set(v) for k,v in combs.items()}
seqs = {k: set(v) for k,v in seqs.items()}

您还可以在构建 subsumablelist 时进行列表推导:

subsumablelist = [
    [comb_ids[0],comb_ids[1],seq_id]
    for comb_ids,comb in combs.items()
    for seq_id,seq in seqs.items()
    if (seq_id not in comb_ids) and all(subseq in comb for subseq in seq)
]

使用 timeit,从您的代码 (4.97s) 到建议的代码 (3.03s) 的时间改进为 39%。


使用 seq.issubset(comb) 代替 all(subseq in comb for subseq in seq)(2.79 秒)将时间改进提高到 43%。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。