Ways to improve this clock algorithm?

Jeff Epler jepler at unpythonic.net
Mon Sep 15 17:49:21 EDT 2003


Well, this doesn't run on my system.  First, I had to change this line:
>             now = time.clock()
-             allseconds = int(now) = int(self.start)
+             allseconds = int(now) - int(self.start)
>             seconds = 0
[In all the excerpts, "-" is a line changed/removed from your version,
and "+" is a line changed/added in my version]

Then, I had to insert an 'import':
+ import time
+
> class ExampleTimer:
>     def __init__(self):

Then, this program kept printing "0 hrs 0 min 0 sec", because clock()
returns CPU time (not wall time) on Unix computers.  time.time() returns
seconds on all systems Python supports, according to the online
documentation. ("import time; help(time.time)")

>     def __init__(self):
-         self.start = time.clock()
+         self.start = time.time()

>         while 1:
-             now = time.clock()
+             now = time.time()

Finally, I'm not sure what your 'for n in range ...' code is intended to
do.  You can convert the number of seconds into the
hours/minutes/seconds more easily:
    # (Replacing the whole 'for' loop and the three asignments above it)
    # Take whole minutes and leave the seconds corresponding to the
    # fraction of minutes in seconds
    minutes = allseconds / 60
    seconds = allseconds % 60

    # Take whole hours and leave the minutes corresponding to the
    # fraction of the hour in minutes
    hours = minutes / 60
    minutes = minutes % 60
You could do this with the built-in function divmod(), as well:
    # (Replacing the whole 'for' loop and the three asignments above it)
    minutes, seconds = divmod(allseconds, 60)
    hours, minutes = divmod(minutes, 60)

You could test starting at different times by changing init:
-     def __init__(self):
-         self.start = time.clock()
+     def __init__(self, offset=0):
+         self.start = time.clock() - offset

Now, you can easily see whether the "rollover" to 1 hour works right:
- app = ExampleTimer()
+ app = ExampleTimer(60*60 - 1)
> app.run()  

Jeff





More information about the Python-list mailing list