擅长:python、mysql、java
<pre><code>import collections
def countWordDistances(li):
wordmap = collections.defaultdict(list)
for i, w in enumerate(li, 1):
wordmap[w].append(i)
for k, v in wordmap.iteritems():
wordmap[k] = sum(v)/float(len(v))
return wordmap
</code></pre>
<p>这使得只对列表进行一次遍历,并将操作保持在最小值。我用110万个词条,29k个独特的单词,在一个单词列表上计时,它的速度几乎是Patrick答案的两倍。在一个由10k个单词组成的列表中,2k是独一无二的,它比OP的代码快了300多倍。在</p>
<p>为了使Python代码运行得更快,有两条规则需要记住:使用最好的算法,避免使用Python。在</p>
<p>在算法方面,迭代列表一次而不是N+1次(N=唯一单词的数量)是加快这一速度的主要因素。在</p>
<p>在“避免Python”方面,我的意思是:您希望您的代码尽可能多地在C中执行。因此,使用<code>defaultdict</code>比显式检查密钥是否存在的dict要好。<code>defaultdict</code>为您检查,但在Python实现中,它是用C语言进行的。<code>enumerate</code>比<code>for i in range(len(li))</code>好,同样因为它的Python步骤更少。并且<code>enumerate(li, 1)</code>使计数从1开始,而不是在循环中的某个地方使用Python+1。在</p>
<p>编辑:第三条规则:使用PyPy。我的代码在PyPy上的速度是2.7的两倍。在</p>