从这篇文章中开始,我已经确定了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更好,这可以纠正您的问题。