2014-11-05 70 views
0

我有一个带有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秒。因为我有大约两万块这样的块,所以我只看了半个星期就做了这个。这是对于50,000,000项目,而不是我需要处理的数十亿...

(是的,我可能应该用另一种语言来做,但我也需要它做得很快, python语言)。

回答

3

有没有必要做一个完整的十字路口,你只是想从大词典匹配元素,如果他们存在。如果一个元素不存在,您可以用0替代,并且对总和没有影响。也不需要将sum的输入转换为列表。

count = sum(kmerCounts.get(x, 0) for x in block.get_kmers()) 
+0

从几天到不到一分钟。谢谢! – 2014-11-05 22:08:49

0

删除在你的列表中理解的方括号把它变成一台发电机的表达:

sum(kmerCounts[x] for x in block.get_kmers().intersection(kmerCounts)) 

,将节省您的时间和一些内存,这又可以减少交换,如果你”重新体验这一点。

您可以在此优化多少程度。切换到其他语言最终可能是您唯一的选择。