Time🔗

The python time module is not accurate enough for precise timing in experiments. The stimuli package provides a more accurate clock, the Clock class, which uses time.perf_counter() or time.monotonic_ns() depending on which has the highest resolution. The sleeping function stimuli.time.sleep() replaces the standard time.sleep() function and make use of the clock from stimuli to achieve a better precision.

Clock()

Clock which keeps track of time in nanoseconds.

sleep(duration, *[, clock])

High precision sleep function.

Sleep performance (linux):

%timeit time.sleep(0.0005)
556 μs ± 131 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

%timeit stimuli.time.sleep(0.0005)
501 μs ± 77.5 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

Example usage:

from stimuli.audio import Tone
from stimuli.trigger import ParallelPortTrigger
from stimuli.time import sleep

sound = Tone(frequency=1000, volume=25, duratin=0.5)
trigger = ParallelPortTrigger("/dev/parport0")

sound.play(when=0.2)
sleep(0.2)
trigger.signal(1)

Regardless of the function used, stimuli is still limited by the accuracy of the on-board computer clock. If you have access to a more accurate clock, you can subclass the abstract class BaseClock to implement your own clock.

BaseClock()

Base class for high precision clocks.

Many objects and functions in stimuli have a clock argument which supports any BaseClock subclass.