解决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()函数延时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()函数,直接通过多次循环实现延时
点击查看代码
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
浙公网安备 33010602011771号