<p>代码缓慢的主要原因可能是在mingetter_rev中分配了一个新数组。您应该在整个过程中重用相同的存储。在</p>
<p>然后,因为实际上不必实现队列,所以可以进行更多的优化。例如,两个堆栈的大小最多(通常)为n,因此您可以将它们保持在同一个数组中,大小为n。从开始处增加一个,从末尾增加一个。在</p>
<p>你会注意到有一个非常规则的模式-从头到尾依次填充数组,从末尾重新计算最小值,在填充数组时生成输出,重复。。。在</p>
<p>这导致了一个实际上更简单的算法,其解释更简单,根本不涉及堆栈。下面是一个实现,并对其工作方式进行了注释。请注意,我没有费心在开头加上NaNs:</p>
<pre><code>def rollin_min(data, n):
#allocate the result. Note the number valid windows is len(data)-(n-1)
result = np.empty(len(data)-(n-1), data.dtype)
#every nth position is a "mark"
#every window therefore contains exactly 1 mark
#the minimum in the window is the minimum of:
# the minimum from the window start to the following mark; and
# the minimum from the window end the the preceding (same) mark
#calculate the minimum from every window start index to the next mark
for mark in range(n-1, len(data), n):
v = data[mark]
if (mark < len(result)):
result[mark] = v
for i in range(mark-1, mark-n, -1):
v = min(data[i],v)
if (i < len(result)):
result[i] = v
#for each window, calculate the running total from the preceding mark
# to its end. The first window ends at the first mark
#then combine it with the first distance to get the window minimum
nextMarkPos = 0
for i in range(0,len(result)):
if i == nextMarkPos:
v = data[i+n-1]
nextMarkPos += n
else:
v = min(data[i+n-1],v)
result[i] = min(result[i],v)
return result
</code></pre>