我有一个带有50,000,000个键(字符串)的字典,映射到该键的计数(这是一个数十亿的子集)。
我还有一系列对象,其中一个类集成员包含几千个字符串,这些字符串可能在或不在dict键中。
我需要以最快的方式找到每个集合的交集。
现在,我就像下面的代码片段一样:
for block in self.blocks:
#a block is a python object containing the set in the thousands range
#block.get_kmers() returns the set
count = sum([kmerCounts[x] for x in block.get_kmers().intersection(kmerCounts)])
#kmerCounts is the dict mapping millions of strings to ints
到目前为止,我的测试每次迭代大约需要15秒。由于我有大约20,000个这样的区块,所以我看了半个星期才做到这一点。那是50,000,000件物品,而不是我需要处理的数十亿......
(是的,我应该用另一种语言做这个,但我也需要快速完成,而且我不擅长非python语言)。
答案 0 :(得分:3)
没有必要进行完整的交集,只需要大字典中的匹配元素(如果存在)。如果元素不存在,您可以替换0
,并且对总和没有影响。也无需将sum
的输入转换为列表。
count = sum(kmerCounts.get(x, 0) for x in block.get_kmers())
答案 1 :(得分:0)
删除列表推导周围的方括号,将其转换为生成器表达式:
sum(kmerCounts[x] for x in block.get_kmers().intersection(kmerCounts))
如果您遇到这种情况,这将节省您一些时间和一些记忆,这可能反过来减少交换。
这里可以优化的数量有一个下限。切换到另一种语言可能最终是您唯一的选择。