[英]Alternative to time.sleep
简介:众所周知, time.sleep
的准确性取决于操作系统和计算负载。 Windows 中的准确性非常差。
类似于/问题/ 17499837的方法可以实现使用一个忙等待time.clock
方法作为替代time.sleep
。 这种方法会造成不必要的负载,影响系统中的其他模块。 这在进行模拟时是不可取的。
为了减少在忙等待花费,而不是依赖于时间量time.sleep
,一类采用方法select.select
并利用超时属性。 见下面的代码:
from sys import platform as _platform
import time, select, socket
class HighResolutionTimeStamp():
__init = time.clock()
__base = time.time()
def __init__(self):
self.__fd = socket.socket()
self.dtts = time.clock if _platform == 'win32' else time.time
def __del__(self):
self.__fd.close()
def get_high_resolution_dt(self):
return HighResolutionTimeStamp.__base + self.dtts() if _platform == 'win32' else time.time()
def busy_wait(self, wait_time):
currentTime = self.dtts()
while (self.dtts() <= currentTime + wait_time):
pass
def sleep(self, wait_time):
currentTime = self.dtts()
while (self.dtts() < (currentTime + wait_time - 0.001)):
select.select([self.__fd], [], [], 0.001)
while (self.dtts() < currentTime + wait_time):
select.select([self.__fd], [], [], 0.0)
if __name__ == '__main__':
st = 1.0/80.0
it = 10
ts = 1
time.sleep(ts)
hrdr = HighResolutionTimeStamp()
total = hrdr.get_high_resolution_dt()
for i in range(it):
hrdr.busy_wait(st)
print 'Ellapsed:', hrdr.get_high_resolution_dt() - total
time.sleep(ts)
total = hrdr.get_high_resolution_dt()
for i in range(it):
hrdr.sleep(st)
print 'Ellapsed:', hrdr.get_high_resolution_dt() - total
time.sleep(ts)
total = hrdr.get_high_resolution_dt()
for i in range(it):
time.sleep(st)
print 'Ellapsed:', hrdr.get_high_resolution_dt() - total
环境:我使用的是 PortablePython2.7.6.1
问题:当代码在 PyScripter 或命令行中执行时,PyScripter 在后台打开,上面的脚本执行得非常准确。 一旦 PyScripter 关闭,方法 sleep 就会变得不准确。 我知道,对于超时select.select
应该是不准确的time.sleep
但在所有的情况下,不会如上述。
结果:
没有在后台运行 PyScripter
C:\..\PortablePython2.7.6.1\App\python.exe highresolutiondt.py
Busy wait. Ellapsed: 0.125249385834
Sleep. Ellapsed: 0.15624165535
Time.sleep. Ellapsed: 0.156844139099
PyScripter 在后台运行
C:\..\PortablePython2.7.6.1\App\python.exe highresolutiondt.py
Busy wait. Ellapsed: 0.125702142715
Sleep. Ellapsed: 0.125874519348
Time.sleep. Ellapsed: 0.120799064636
这使用了自 unix epoch 以来的时间,我很确定这更准确,不过我不使用 windows,所以我没有对此进行测试。
from time import time
def pause(secs):
init_time = time()
while time() < init_time+secs: pass
print("See ya in 10 seconds")
pause(10)
print("Heeeeeelooooo there")
希望有帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.