找到巨大的集合的交叉点与巨大的dicts

时间:2014-11-05 21:47:40

标签: python

我有一个带有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语言)。

2 个答案:

答案 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))

如果您遇到这种情况,这将节省您一些时间和一些记忆,这可能反过来减少交换。

这里可以优化的数量有一个下限。切换到另一种语言可能最终是您唯一的选择。