как эффективно рассчитать медиану бега

Я позаимствовал некоторый код, пытаясь реализовать функцию для вычисления текущей медианы для тонны данных. Текущий слишком медленный для меня (Сложность в том, что мне нужно исключить все нули из поля бега). Ниже приведен код:

from itertools import islice
from collections import deque
from bisect import bisect_left,insort

def median(s):
    sp = [nz for nz in s if nz!=0]
    print sp
    Mnow = len(sp)
    if Mnow == 0:
        return 0
    else:
        return np.median(sp)

def RunningMedian(seq, M):
    seq = iter(seq)
    s = []

    # Set up list s (to be sorted) and load deque with first window of seq
    s = [item for item in islice(seq,M)]
    d = deque(s)

    # Sort it in increasing order and extract the median ("center" of the sorted window)
    s.sort()
    medians = [median(s)]
    for item in seq:
        old = d.popleft()          # pop oldest from left
        d.append(item)             # push newest in from right
        del s[bisect_left(s, old)] # locate insertion point and then remove old 
        insort(s, item)            # insert newest such that new sort is not required        
        medians.append(median(s))
    return medians

Работает хорошо, единственный недостаток в том, что он слишком медленный. Кто-нибудь может помочь мне улучшить код, чтобы быть более эффективным? Благодарю.

После того, как я изучил все возможности, следующий простой код может сравнительно эффективно вычислять:

def RunningMedian(x,N):
    idx = np.arange(N) + np.arange(len(x)-N+1)[:,None]
    b = [row[row>0] for row in x[idx]]
    return np.array(map(np.median,b))
    #return np.array([np.median(c) for c in b])  # This also works

Спасибо @Divakar.

Ответы на вопрос(2)

Ваш ответ на вопрос