我想做一个看似简单的操作,也许我只是被阻止了,但是执行此计算的最快方法是什么?
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.cumprod
的组合和 np.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
检查了 540 个随机数数组(对应于最大的数组)的性能优势。的%timeit
。我得到的加速为 2.3ms/10μs=230。甚至计算 %timeit
的缓存效果警告(可能是错误的)你肯定有至少 40 的加速。
关于python - 对类似列表的对象进行乘积和求和的简单矢量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41983818/