<p>一个加速将是删除<code>sum</code>部分,因为在这个实现中,它将长度2到<code>INTERVAL_LENGTH</code>的列表相加。相反,只需将<code>volume[j+1]</code>添加到循环最后一次迭代的vol的前一个结果中。因此,每次只需添加两个整数,而不是对整个列表求和并对其进行每次切片。另外,不要从做<code>sum(volume[i+1:j+1])</code>开始,只要做<code>vol = volume[i+1] + volume[j+1]</code>,正如你所知道的,这里的初始情况总是只有两个索引。</p>
<p>另一个加速方法是使用<code>.extend</code>,而不是<code>.append</code>,因为python实现的<code>extend</code>运行速度要快得多。</p>
<p>您还可以分解最后的<code>if</code>语句,以便仅在需要时执行某些计算。例如,你知道<code>if vol <= 100</code>,你不需要计算<code>ret</code>。</p>
<p>这并不能准确地回答你的问题,但我认为特别是在sum问题上,你应该看到这些变化带来了显著的加速。</p>
<p>编辑-您也不需要<code>len</code>,因为您已经明确知道列表的长度(除非这只是示例)。将其定义为数字而不是<code>len(something)</code>总是更快。</p>
<p>编辑-实现(未经测试):</p>
<pre><code>ARRAY_LENGTH = 500000
INTERVAL_LENGTH = 15
close = np.array( xrange(ARRAY_LENGTH) )
volume = np.array( xrange(ARRAY_LENGTH) )
close, volume = close.astype('float64'), volume.astype('float64')
results = []
ex = results.extend
for i in xrange(ARRAY_LENGTH - INTERVAL_LENGTH):
vol = volume[i+1]
for j in xrange(i+1, i+INTERVAL_LENGTH):
vol += volume[j+1]
if vol > 100:
ret = close[j] / close[i]
if 1.0001 < ret < 1.5:
ex( [i, j, ret, vol] )
print results
</code></pre>