簡體   English   中英

簡單的矢量化:先取乘積,然后求和一個列表狀對象

[英]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.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()會匯總所有元素以提供您的結果。 (感謝@BM指出正確的切片。)

順便說一句,我使用ipython%timeit檢查了540個隨機數(對應於最大的數組)的性能優勢。 我獲得了2.3ms / 10µs = 230的加速。 即使算上%timeit警告的緩存效果(可能不正確),您肯定也可以使速度至少提高40。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM