下面的代码非常通用。在最终状态下,它将运行一些操作(例如从串行流中采样数据),但我现在的目标是优化循环结构以尽可能快地运行。
目前,在触发 if 语句之前,我获得的最大频率约为 100-140。
有没有更有效的方法来运行它?
注意:我知道 while 循环本质上是空的。当然,它运行速度的限制因素将是我在其中调用的函数。我要确保的是 while 循环中的代码尽可能高效地运行
import time
frequency = float(raw_input("enter sampling frequency in Hz: "))
zero_time=time.time()
i=0
try:
while True:
sample_start_time=time.time()
print 'sample',i, 'taken at', sample_start_time-zero_time
i+=1
sample_end_time=time.time()
if 1/frequency-(sample_end_time-sample_start_time)<0:
print "sampling frequency is too large...closing"
break
time.sleep(1/frequency-(sample_end_time-sample_start_time))
except KeyboardInterrupt:
pass
请您参考如下方法:
正如评论所说,这个问题对于一个空循环来说有点毫无意义,但这里有一些可能会有所帮助的事情(大致按重要性递增排序)。
- 从循环中删除
print语句。这可能是您目前正在做的最昂贵的事情。 - 调查替代计时器。
time.time和time.sleep可能无法提供最佳性能,timeit模块有一些替代方案。 - 提前计算定时器的周期,而不是重复执行
1/frequency。 - 只计算一次时间差(以及该差与周期之间的差),而不是每个循环计算两次。
即使您不想测试您的实际工作案例,您也可能想在循环中调用一个空函数,这样您就可以看到函数调用开销有多少。它可能比我上面列表中的 3 和 4 花费更多的时间。
