如何解决我需要速度比较两个非常大的字典:键是索引存储为元组的原始熊猫索引,值是字符串列表
首先感谢您为我阅读和使用的其他人提供的一千个回答问题。但现在我需要发布我自己的问题。在 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 举报,一经查实,本站将立刻删除。