我想完成这个人做的事情:
但是我需要优化它以超快速运行.简而言之,我想要一个时间序列,并告诉每次它越过零(改变符号).我想记录过零点之间的时间.由于这是真实的数据(32位浮点数),我怀疑我每个都有一个正好为零的数字,所以这并不重要.我目前有一个计时程序,所以我会把你的结果计算在内,看看谁赢了.
我的解决方案给出(微秒):
open data 8384
sign data 8123
zcd data 415466
Run Code Online (Sandbox Code Playgroud)
如您所见,过零检测器是缓慢的部分.这是我的代码.
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()
Run Code Online (Sandbox Code Playgroud) 这个问题从寻找提供的答案源于此有关的问题计数的数量过零点.提供了几个解决问题的答案,但NumPy appproach在时间上摧毁了其他人.
当我比较四个答案时,我注意到NumPy解决方案为大序列提供了不同的结果.有问题的四个答案是循环和简单生成器,更好的生成器表达式和NumPy解决方案.
问题:为什么NumPy解决方案提供的结果与其他三种解决方案不同?(哪个是正确的?)
以下是计算过零次数的结果:
Blazing fast NumPy solution
total time: 0.303605794907 sec
Zero Crossings Small: 8
Zero Crossings Med: 54464
Zero Crossings Big: 5449071
Loop solution
total time: 15.6818780899 sec
Zero Crossings Small: 8
Zero Crossings Med: 44960
Zero Crossings Big: 4496847
Simple generator expression solution
total time: 16.3374049664 sec
Zero Crossings Small: 8
Zero Crossings Med: 44960
Zero Crossings Big: 4496847
Modified generator expression …Run Code Online (Sandbox Code Playgroud)