[英]Simple vectorization of taking the product and then sum of a list-like object
我想執行一個看似簡單的操作,也許只是被阻止了,但是執行此計算的最快方法是什么?
mret = 0
for i in range(1, len(monthly_rets)):
mret += monthly_rets[i:].prod()
month_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()
會匯總所有元素以提供您的結果。 (感謝@BM指出正確的切片。)
順便說一句,我使用ipython
的%timeit
檢查了540個隨機數(對應於最大的數組)的性能優勢。 我獲得了2.3ms / 10µs = 230的加速。 即使算上%timeit
警告的緩存效果(可能不正確),您肯定也可以使速度至少提高40。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.