quiero hacer exactamente lo que este hombre hizo:detectar eficientemente inscripciones cambios en pitón
Sin embargo tengo que optimizarlo para correr muy rápido. En resumen, quiero tomar una serie temporal y decir cada vez que cruza las cruces cero (cambia de signo). Quiero registrar el tiempo entre cruces cero. Como se trata de datos reales (flotación de 32 bits), dudo que cada uno tenga un número que sea exactamente cero, por lo que no es importante. Actualmente tengo un programa de sincronización en el lugar así que voy a medir el tiempo de tus resultados para ver quién gana.
Mi solución da (micro segundos):
open data 8384
sign data 8123
zcd data 415466
Como se puede ver el detector de cruce por cero es la parte lenta. Aquí está mi código.
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()
Hay un módulo 'timeit', ¿sabes? :) –
Interesante ... Me gusta más la mía porque se puede poner en una función. Puede soltar un t() cada par de líneas y encontrar cuellos de botella rápidamente. Si tan solo quisiera sincronizar mi función, habría utilizado el linux '$ time python zcd.py' – chriscauley
Supongo que la línea' time ('data') 'significa' t ('sign data') ' . ¿Lo es? –