Эффективно обнаруживать изменения знаков в Python

Я хочу делать именно то, что сделал этот парень:

Python - изменение знака подсчета

Однако мне нужно его оптимизировать бегать очень быстро. Вкратце, я хочу взять временной ряд и рассказывать каждый раз, когда он пересекает ноль (меняет знак). Я хочу записать время между переходами через ноль. Поскольку это реальные данные (32-битное число с плавающей запятой), я сомневаюсь, что у каждого будет число, равное нулю, так что это не важно. В настоящее время у меня есть временная программа, так что я рассчитаю ваши результаты, чтобы увидеть, кто победит.

Мое решение дает (микросекунды):

open data       8384
sign data       8123
zcd data        415466

Как вы можете видеть, детектор перехода через ноль - это медленная часть. Вот мой код.

import numpy, datetime

class timer():
    def __init__(self):
        self.t0 = datetime.datetime.now()
        self.t = datetime.datetime.now()
    def __call__(self,text='unknown'):
        print text,'\t',(datetime.datetime.now()-self.t).microseconds
        self.t=datetime.datetime.now()

def zcd(data,t):
    sign_array=numpy.sign(data)
    t('sign data')
    out=[]
    current = sign_array[0]
    count=0
    for i in sign_array[1:]:
        if i!=current:
            out.append(count)
            current=i
            count=0
        else: count+=1
    t('zcd data')
    return out

def main():
    t = timer()
    data = numpy.fromfile('deci.dat',dtype=numpy.float32)
    t('open data')
    zcd(data,t)

if __name__=='__main__':
    main()

29
задан Community 23 May 2017 в 11:47
поделиться