<p>600万行既可以保存在内存中,也可以保存在SQLite数据库中。把它放在那里,并利用查找优化提供:</p>
<pre><code>with open('ssm_resnik.txt', 'rbU') as uniprot_vs_uniprot:
reader = csv.reader(uniprot_vs_uniprot, delimiter='\t')
allVSall = { tuple(r[:2]): float(r[2]) for r in reader }
</code></pre>
<p>现在,<code>allVSall</code>是一个提供O(1)查找的映射;这就省去了为每个生成的组合遍历整个600万行的开销。这是一批被保存的循环。在</p>
<p>在阅读<code>all_spot_uniprot</code>列表时,使用<code>collections.defaultdict</code>更容易:</p>
^{pr2}$
<p>这里不需要找到<code>max</code>值,只需列出这些键并将它们传递给<code>itertools.permutations</code>和{<cd6>}函数来生成组合。在</p>
<p>下面的代码以更紧凑的形式复制您的操作,使用更少的列表,使用O(1)字典查找可以减少循环:</p>
<pre><code>from itertools import permutations, product, ifilter
no_no_data = lambda v: v != 'No Data'
dict_corresp_media = {}
for a, b in permutations(dict_STU.iterkeys(), r=2):
# retrieve the a and b lists of possible keys, for which we need to loop over their products
# we filter each for the `No Data` keys
aval, bval = ifilter(no_no_data, dict_STU[a]), ifilter(no_no_data, dict_STU[b])
matches = [allVSall[c1, c2] for c1, c2 in product(aval, bval) if (c1, c2) in allVSall]
dict_corresp_media['{}_{}'.format(a, b)] = sum(matches) / len(matches) if matches else 0
</code></pre>
<p>对于输入样本,它会在几秒钟内发出:</p>
<pre><code>>>> pprint.pprint(dict_corresp_media)
{'10_1': 0,
'10_2': 0,
'10_3': 0,
'10_4': 0,
'10_5': 0,
'10_6': 0,
'10_7': 0,
'10_8': 0,
'10_9': 0,
'1_10': 0.05619465373456477,
'1_2': 0.12077157944440875,
'1_3': 0,
'1_4': 0.12077157944440875,
'1_5': 0,
'1_6': 0.07139907404780385,
'1_7': 0.04759366973303256,
'1_8': 0.12077157944440875,
'1_9': 0,
'2_1': 0,
'2_10': 0,
'2_3': 0,
'2_4': 0,
'2_5': 0,
'2_6': 0,
'2_7': 0,
'2_8': 0,
'2_9': 0,
'3_1': 0,
'3_10': 0,
'3_2': 0,
'3_4': 0,
'3_5': 0,
'3_6': 0,
'3_7': 0,
'3_8': 0,
'3_9': 0,
'4_1': 0,
'4_10': 0,
'4_2': 0,
'4_3': 0,
'4_5': 0,
'4_6': 0,
'4_7': 0,
'4_8': 0,
'4_9': 0,
'5_1': 0,
'5_10': 0,
'5_2': 0,
'5_3': 0,
'5_4': 0,
'5_6': 0,
'5_7': 0,
'5_8': 0,
'5_9': 0,
'6_1': 0,
'6_10': 0,
'6_2': 0,
'6_3': 0,
'6_4': 0,
'6_5': 0,
'6_7': 0,
'6_8': 0,
'6_9': 0,
'7_1': 0,
'7_10': 0,
'7_2': 0,
'7_3': 0,
'7_4': 0,
'7_5': 0,
'7_6': 0,
'7_8': 0,
'7_9': 0,
'8_1': 0,
'8_10': 0,
'8_2': 0,
'8_3': 0,
'8_4': 0,
'8_5': 0,
'8_6': 0,
'8_7': 0,
'8_9': 0,
'9_1': 0,
'9_10': 0,
'9_2': 0,
'9_3': 0,
'9_4': 0,
'9_5': 0,
'9_6': 0,
'9_7': 0,
'9_8': 0}
</code></pre>