<p>我不确定我们如何使用线性代数和矢量化来加快这个函数的速度,但是使用列表理解,我们编写了一个更快的算法。首先,将函数定义为:</p>
<pre><code>def faster_condrolmax(df):
df['cond_index'] = [df.index[i] if df['bool'][i]==False else 0 for i in
df.index]
df['cond_comp_index'] = [np.max(df.cond_index[0:i]) for i in df.index]
df['cond_comp_index'] = df['cond_comp_index'].fillna(0).astype(int)
df['condrolmax'] = np.zeros(len(df.close))
df['condrolmax'] = [np.max(df.close[df.cond_comp_index[i]:i]) if
df.cond_comp_index[i]<i else df.close[i] for
i in range(len(df.close))]
return df
</code></pre>
<p>然后,您可以使用:</p>
<pre><code>!pip install line_profiler
%load_ext line_profiler
</code></pre>
<p>要添加和加载line profiler并查看每行代码需要多长时间,请执行以下操作:</p>
<pre><code>%lprun -f faster_condrolmax faster_condrolmax(df)
</code></pre>
<p>这将导致:
<a href="https://i.stack.imgur.com/2d3Tm.jpg" rel="nofollow noreferrer">Each line profiling results</a></p>
<p>当然,看看整个功能需要多长时间:</p>
<pre><code>%timeit faster_condrolmax(df)
</code></pre>
<p>这将导致:
<a href="https://i.stack.imgur.com/wbFrZ.jpg" rel="nofollow noreferrer">Total algorithm profiling result</a></p>
<p>如果你使用SeaBean函数,你可以得到更好的结果,速度是我建议的函数的一半。然而,SeaBean的估计速度似乎并不稳定,要估计他的函数,您应该在更大的数据集上运行它,然后再决定。这都是因为%timeit报告如下:
<a href="https://i.stack.imgur.com/yWhcl.jpg" rel="nofollow noreferrer">SeaBean's function profiling result</a></p>