python 3.x和Windows 7不正确的时间.Sleep()



从这篇文章中开始,我已经确定了python time.sleep((函数的非功能实现(企业,64位和Python 3.4.4(。

这是引用.py脚本:

import threading, time
def Return():
    return
def Setup():
    for _ in range(10):
        time_before = time.time()
        Return()
        wait_delay = -time.time()
        delays = []
        InputFrequency = 60
        while (time.time() - time_before) < (1 / InputFrequency):
            time.sleep(0)
        wait_delay += time.time()
        delays.append(wait_delay)
        print("Output frequency: " + str([1/t for t in delays][0]) + " Hz")
threading.Thread(target=Setup).start()

按照此示例,该脚本应产生大约60hz的输出频率。但是,当我的Windows 7 Enterprise机器上运行时,这些是我对给定输入频率收到的输出频率:

输入:10Hz-输出:9.15Hz


输入:20Hz-输出:16.03Hz


输入:30Hz-输出21.37Hz


输入范围:40Hz -64Hz-输出:32.05Hz


输入范围:65Hz -10kHz - 输出:64.10Hz


这里发生了什么?为什么会产生相同输出频率的输入频率(40Hz以上(?为什么即使输入频率超过10,000Hz,输出频率上限64.10Hz也是如此?我不认为这是一个时间。提供给IDEONE.com脚本的相同输入频率值会产生预期的输出频率,因此必须与我的计算机相关。

python几乎没有保证这些呼叫的表现,尤其是跨平台。这里有两件事可能会出错 - time.time()的分辨率比您试图实现的分辨率更糟糕,或者sleep的分辨率是。

在最近的平台上,睡眠应至少至少1至2 ms准确:

python的time.sleep((?

这留下time.time()。此特定呼叫的文档警告说,准确性可能很差:

请注意,即使时间总是返回作为浮点 数字,并非所有系统都提供比1更好的精度 第二。虽然此函数通常返回非淘汰值,但 如果系统时钟有 被放回两个电话之间。

幸运的是,time.perf_counter()中提供了更高的分辨率时钟API,该时钟试图访问平台上可用的最高分辨率时钟。从文档中:

返回性能计数器的值(分数秒(, 即具有最高可用分辨率的时钟,以测量一个短的时间 期间。它确实包括睡眠期间经过的时间,是 整个系统。返回值的参考点不确定, 因此,只有连续调用结果之间的差异 有效。

在Windows的情况下,这似乎比60Hz更好,这可以纠正您的问题。

最新更新