Alternative to time.sleep

INTRO: It is well known that accuracy time.sleep

depends on OS and computational load. The accuracy in Windows is very poor.

Likewise on this StackOverflow question a method can implement wait-wait using the method time.clock

as an alternative time.sleep

. This approach creates unnecessary load affecting other modules in the system. This is not desirable when modeling.

To reduce the busy timeout and not rely on time.sleep

, the class uses the method select.select

and uses the timeout attribute. See the following code:

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

      

ENVIRONMENT: I ​​am using PortablePython2.7.6.1

PROBLEM: When the code is executed in PyScripter or the command line with PyScripter open in the background, the script above is very accurate. When PyScripter is closed, the sleep method becomes imprecise. I know the timeout for select.select

must be imprecise as time.sleep

, but in all cases not as described above.

Results:

Without PyScripter running in the background

C:\..\PortablePython2.7.6.1\App\python.exe highresolutiondt.py

Busy wait. Ellapsed: 0.125249385834

Sleep. Ellapsed: 0.15624165535

Time.sleep. Ellapsed: 0.156844139099

      

With PyScripter running in the background

C:\..\PortablePython2.7.6.1\App\python.exe highresolutiondt.py

Busy wait. Ellapsed: 0.125702142715

Sleep. Ellapsed: 0.125874519348

Time.sleep. Ellapsed: 0.120799064636

      

+3


source to share





All Articles