取乘积然后对类似列表的对象求和的简单矢量化



我想做一个看似简单的操作,也许我只是被阻止了,但是执行此计算的最快方法是什么?

mret = 0
for i in range(1, len(monthly_rets)):
    mret += monthly_rets[i:].prod()

monthly_rets是一个长度为2-540的np.array(即它的长度可以从2到540不等,它不必是np.array)的月因子回报(对于这个问题来说应该无关紧要)。一定有一些聪明的技巧,我可以用来避免使用那个for循环并加快一点速度?

您可以使用np.cumprodnp.sum的组合。这样的东西应该有效(至少对于 numpy 数组):

mret = monthly_rets[:0:-1].cumprod().sum()

np.cumprod计算数组的累积乘积,这意味着如果你有一个a数组,其中包含三个元素a[0]a[1]a[2] a.cumprod() 会给你数组[a[0], a[0]*a[1], a[0]*a[1]*a[2]]。现在你想要类似的东西。这是通过使用切片[:0:-1]来完成的,它将向后遍历数组,以倒数第二个元素结束,这样a[:0:-1].cumprod()就会给你[a[2], a[1]*a[2]]。 然后sum()将汇总所有元素以为您提供结果。(感谢@B.M.指出正确的切片。

顺便说一句,我使用 ipython%timeit检查了 540 个随机数数组(对应于您最大的数组)的性能优势。我得到了2.3ms/10μs=230的加速。即使算上%timeit警告的缓存效果(可能不正确),您肯定至少有 40 的加速。

最新更新