簡體   English   中英

關於如何加速這個 python function 的建議?

[英]Suggestions on how to speed up this python function?

有關如何加快此 function 的任何建議?

def smooth_surface(z,c):
    hph_arr_list = []
    for x in xrange(c,len(z)-(c+1)):
        new_arr = np.hstack(z[x-c:x+c])
        hph_arr_list.append(np.percentile(new_arr[((new_arr >= np.percentile(new_arr,15)) & (new_arr <= np.percentile(new_arr,85)))],99))
    return np.array(map(float,hph_arr_list))

變量z的長度約為 1500 萬, c是 window 大小+-的值。 function 基本上是一個滑動 window,它計算每次迭代的百分位值。 任何幫助,將不勝感激! z是一個 arrays 數組(因此是np.hstack )。 也許任何想法 numba 會對此有所幫助。 如果有,如何實施?

計算的緩慢部分似乎是行np.percentile(new_arr[((new_arr >= np.percentile(new_arr,15)) & (new_arr <= np.percentile(new_arr,85)))],99) . 這是由於小np.percentile上的 np.percentile 出乎意料地緩慢,以及創建了幾個中間 arrays。

由於new_arr實際上很小,因此僅對其進行排序並自己進行插值會快得多。 此外,numba 還可以幫助加快計算速度。

@njit #Use @njit instead of @jit to increase speed
def filter(arr):
    arr = arr.copy() # This line can be removed to modify arr in-place
    arr.sort()
    lo = int(math.ceil(len(arr)*0.15))
    hi = int(len(arr)*0.85)
    interp = 0.99 * (hi - 1 - lo)
    interp = interp - int(interp)
    assert lo <= hi-2
    return arr[hi-2]* (1.0 - interp) + arr[hi-1] * interp

在我的機器上使用大小為 20 的 arrays 時,此代碼快 160 倍,並且應該產生相同的結果。

最后,您也可以通過在 numba 中使用自動並行化來加速smooth_surface (有關更多信息,請參見此處)。 這是一個未經測試的原型:

@jit(parallel=True)
def smooth_surface(z,c):
    hph_arr = np.zeros(len(z)-(c+1)-c)
    for x in prange(c,len(z)-(c+1)):
        hph_arr[x-c] = filter(np.hstack(z[x-c:x+c]))
    return hph_arr

暫無
暫無

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

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