1

下面的代码非常通用。在它的最终状态下,它将运行一些操作(例如从串行流中采样数据),但我现在的目标是优化循环结构以尽可能快地运行。

目前,在执行 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
4

3 回答 3

4

正如评论所说,这个问题对于一个空循环来说有点毫无意义,但这里有一些可能会有所帮助的事情(大致按重要性增加排序)。

  1. print从循环中删除语句。这可能是您目前正在做的最昂贵的事情。
  2. 调查替代计时器。time.time并且time.sleep可能无法提供最佳性能,并且该timeit模块有一些替代方案。
  3. 提前计算你的计时器的周期,而不是1/frequency重复做。
  4. 只计算一次时间之间的差异(以及该差异与周期之间的差异),而不是每个循环两次。

即使您不想测试您的实际工作案例,您也可能希望在循环中调用一个空函数,这样您就可以看到函数调用开销的成本。在我上面的列表中,它可能需要比 3 和 4 更多的时间。

于 2012-11-10T20:16:40.693 回答
3
from time import time, sleep
frequency = float(raw_input("enter sampling frequency in Hz: "))
target_freq = 1/frequency

try:
    sampling_rate = target_freq
    while sampling_rate >= target_freq:
        sample_start_time = time()
        # maybe do some stuff here
        sample_end_time = time()
        time_diff = sample_end_time - sample_start_time
        if time_diff < target_freq:
            sleep(target_freq - time_diff)
except KeyboardInterrupt:
    pass

查看 Python性能提示页面,尤其是关于避免点的部分。

于 2012-11-10T20:34:44.160 回答
3

是的,您的“while 循环”正在尽可能高效地运行。您不能编写比以下更有效的 while 循环:

while True:
    # doStuff
于 2012-11-10T20:12:12.390 回答