VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 解决Python time.sleep()函数短时间延时不准确,实现延时误差小于0.01ms

time.sleep()函数能够暂停当前线程的运行,实现延时功能,而window系统中使用time.sleep()函数暂停当前线程并再次执行当前线程需要一定的时间(大约在ms级)。
time.perf_counter()函数的返回值为系统已经运行的时间(float类型,单位:s),该时间具有非常高的分辨率和精度,因此可以测量较短的持续时间,测量范围包含time.sleep()的休眠时间。
time.perf_counter_ns()函数则是将返回值改为了int类型,单位变为了ns。

不使用time.sleep()函数的运行情况:

点击查看代码

import time
a = time.perf_counter_ns()
# time.sleep(0.001)
b = time.perf_counter_ns()
print("a = %.4f" % (a/1000000), " ms\n", "b = %.4f" % (b/1000000), " ms", sep='')
print("b-a = %.4f" % ((b-a)/1000000), "ms")

运行结果为:

a = 960481122.4417 ms
b = 960481122.4420 ms
b-a = 0.0003 ms

不使用time.sleep()函数时,多次尝试后,执行time.perf_counter_ns()函数所耗费的时间均<0.001ms。
使用time.sleep()函数延时1ms的运行情况:

点击查看代码

import time
a = time.perf_counter_ns()
sleep(0.001)
b = time.perf_counter_ns()
print("a = %.4f" % (a/1000000), " ms\n", "b = %.4f" % (b/1000000), " ms", sep='')
print("b-a = %.4f" % ((b-a)/1000000), "ms")

运行结果为:

a = 960910032.3047 ms
b = 960910046.0363 ms
b-a = 13.7316 ms

当使用time.sleep()函数延迟1ms时,实际经过了>10ms,多次尝试的结果均在10ms左右,这表明time.sleep()函数不能准确实现ms级的短时间延时。
解决方法:不采用time.sleep()函数,直接通过多次循环实现延时

点击查看代码

import time
def delay_ms(t):  # 传入的参数为延时的时间(float类型,单位ms),返回循环次数
    if t <= 0:
        return 0
    t0 = int(1000000 * t)
    t1 = time.perf_counter_ns()
    t2 = time.perf_counter_ns()
    t3 = 0
    i = 0
    while True:
        i += 1
        t2 = time.perf_counter_ns()
        t3 = t2 - t1
        if t3 >= t0:
            return i
a = time.perf_counter_ns()
delay_ms(100.01)  # 延时时间,单位ms
b = time.perf_counter_ns()
print("a = %.4f" % (a/1000000), " ms\n", "b = %.4f" % (b/1000000), " ms", sep='')
print("b-a = %.4f" % ((b-a)/1000000), "ms")
运行结果为:
a = 961739056.7461 ms
b = 961739156.7622 ms
b-a = 100.0161 ms

目标延时为100.01ms,实际延时为100.0161ms,相差<0.01ms,该延时方法不会因为延时时间长短而影响精度。 (注:Window11系统,i5 13400,Python3.10)

来源:https://www.cnblogs.com/yxyj/p/18817559


相关教程