wie man den laufenden Median effizient berechnet

Ich habe mir einen Code ausgeliehen, der versucht, eine Funktion zum Berechnen des laufenden Medians für eine Tonne Daten zu implementieren. Die aktuelle ist mir zu langsam Der schwierige Teil ist, dass ich alle Nullen aus der laufenden Box ausschließen muss). Unten ist der Code:

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

Es funktioniert gut, der einzige Nachteil ist, dass es zu langsam ist. Kann mir jemand helfen, den Code effizienter zu gestalten? Vielen Dank

Nachdem ich alle Möglichkeiten erkundet habe, kann der folgende einfache Code vergleichsweise effizient berechnet werden:

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

Danke @ Divakar.