Search code examples
pythontimingbenchmarking

scheduling a print command at specific timings after the script started in Python


I want to schedule a text 'hello world' at various timings (form a list), since the script has started. What would be the best way to do it?

This is probably wrong, but what I have so far:

import time
times = [1.76493425, 3.10174059, 4.49576803, 10.99379224, 18.84178369] #at these times since onset of script, a text "hello world" should be printed

start = time.time()

def main():
    for cuetime in times:
        print ('hello world', ' - timing: ', cuetime, ' - now: ', time.time()- start)
    yield viztask.waitTime(cuetime)

main()

This gives me:

('hello world', ' - timing: ', 1.76493425, ' - now: ', 0.0)
('hello world', ' - timing: ', 3.10174059, ' - now: ', 1.7699999809265137)
('hello world', ' - timing: ', 4.49576803, ' - now: ', 3.5379998683929443)
('hello world', ' - timing: ', 10.99379224, ' - now: ', 5.305999994277954)
('hello world', ' - timing: ', 18.84178369, ' - now: ', 7.075000047683716)

But what I actually need is the timing elements/items to be the same as the "now" time, because the elements in the timing list ARE the timings at which the text "hello world" should be printed relative to the onset of the script.


Solution

  • What about schedule module. Haven't worked with it before, but you can achieve your goal quite easily:

    import schedule
    import time
    from functools import partial
    # your specified list of times
    times = [1.76493425, 3.10174059, 4.49576803, 10.99379224, 18.84178369]
    # define a job you want to do
    def job(t, start):
        print ('hello world', ' - timing: ', t, ' - now: ', time.time()- start)
        # pop the job right away from schedule.jobs, so it runs only once
        return schedule.CancelJob
    # get the starting time
    start = time.time()
    # for each time add what to do
    for t in times:
        # using partial so i can pass arguments to job
        schedule.every(t).seconds.do(partial(job, t, start))
    # and run it inside a lop
    while True:
        schedule.run_pending()
        # schedule.jobs is just a list of jobs
        if not schedule.jobs:
            break
    

    Prints out:

    hello world  - timing:  1.76493425  - now:  1.7650279998779297
    hello world  - timing:  3.10174059  - now:  3.101846933364868
    hello world  - timing:  4.49576803  - now:  4.495898962020874
    hello world  - timing:  10.99379224  - now:  10.993950605392456
    hello world  - timing:  18.84178369  - now:  18.84195566177368