Trying to sleep milliseconds time.sleep(0.001) not working as expected, alternatives?

Question:

I’m trying to run a function approximately 200 times a second (give or take +- 50). When using time.sleep(0.005), I find that it sleeps for much longer. I understand that time.sleep is not accurate, but my use case doesn’t need much accuracy either.

I searched this problem up and it seems to be an issue with Windows 10 & 11 in particular: https://bugs.python.org/issue44681

They don’t seem to be keen on fixing this issue, so I was wondering what alternatives are there for sleeping for around a millisecond?

I tested this code:

last_time = time.time()
counter = 0
while True:
    now = time.time()
    if now - last_time >= 1:
        print(counter)
        last_time = now
        counter = 0
    counter += 1

Which gave me around 64 to 65 on my computer and around 70 on my laptop.

Asked By: Subversion1

||

Answers:

While time.sleep() can be useful for some purposes, it is not the most accurate or reliable way to achieve precise timing in a program.

One alternative you could consider is using the perf_counter() function from the time module instead of sleep(). The perf_counter() function returns a high-resolution performance counter value, which can be more accurate than sleep() for measuring elapsed time.

Here is an example of how you could use perf_counter() to achieve a target frequency of approximately 200 times per second:

import time

target_frequency = 200  # Hz
target_period = 1 / target_frequency  # seconds

last_time = time.perf_counter()
counter = 0
while True:
    now = time.perf_counter()
    elapsed_time = now - last_time
    if elapsed_time >= target_period:
        print(counter)
        last_time = now
        counter = 0
    counter += 1
    # Sleep for a short amount of time to allow other processes to run
    time.sleep(0.001)

By using perf_counter() to measure the elapsed time and sleeping for a short period of time after each iteration of the loop, you should be able to achieve a frequency that is close to the target frequency of 200 times per second.

You may also want to consider using a separate thread or process to run your program, as this can help to improve the accuracy of the timing.

Answered By: Jondi
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.