【发布时间】:2011-04-20 01:43:15
【问题描述】:
我想做这家伙所做的事情:
但是我需要优化它以超快运行。简而言之,我想采取一个时间序列并告诉它每次越过零(更改符号)。我想记录过零之间的时间。由于这是真实数据(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()
【问题讨论】:
-
有一个'timeit'模块,你知道吗? :)
-
有趣...我更喜欢我的,因为它可以放在整个函数中。您可以每隔几行删除一个 t() 并快速找到瓶颈。如果我只是想计时我的功能,我会使用 linux
$ time python zcd.py -
我猜
time('sign data')应该是t('sign data')。是吗? -
@Muhammad Alkarouri - 是的,谢谢。我会解决的。
标签: python math performance numpy