[Python-checkins] peps: PEP 418: Add precision in Python; clock() will not be removed; add users

victor.stinner python-checkins at python.org
Fri Apr 13 22:47:49 CEST 2012


http://hg.python.org/peps/rev/87ed37a05fad
changeset:   4241:87ed37a05fad
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Fri Apr 13 22:07:36 2012 +0200
summary:
  PEP 418: Add precision in Python; clock() will not be removed; add users

files:
  pep-0418.txt                |  103 +++++++++++++----------
  pep-0418/clock_precision.py |   55 ++++++++++++
  2 files changed, 111 insertions(+), 47 deletions(-)


diff --git a/pep-0418.txt b/pep-0418.txt
--- a/pep-0418.txt
+++ b/pep-0418.txt
@@ -58,9 +58,20 @@
   period
 * ``time.process_time()``: profiling, CPU time of the process
 
-``time.clock()`` is deprecated by this PEP because it is not portable:
-``time.perf_counter()`` or ``time.process_time()`` should be used
-instead, depending on your requirements.
+Users of new functions:
+
+ * time.monotonic(): concurrent.futures, multiprocessing, queue, subprocess,
+   telnet and threading modules to implement timeout
+ * time.perf_counter(): trace and timeit modules, pybench program
+ * time.process_time(): profile module
+ * time.get_clock_info(): pybench program to display information about the
+   timer like the precision or the resolution
+
+The ``time.clock()`` function is deprecated by this PEP because it is not
+portable: it behaves differently depending on the operating system.
+``time.perf_counter()`` or ``time.process_time()`` should be used instead,
+depending on your requirements. ``time.clock()`` is marked as deprecated but
+is not planned for removal.
 
 
 Python functions
@@ -84,7 +95,7 @@
 
 * Mandatory keys:
 
-  * "function" (str): name of the underlying operating system
+  * "implementation" (str): name of the underlying operating system
     function.  Examples: "QueryPerformanceCounter()",
     "clock_gettime(CLOCK_REALTIME)".
   * "resolution" (float): resolution in seconds of the clock
@@ -105,7 +116,7 @@
 undefined, so that only the difference between the results of
 consecutive calls is valid.
 
-Availability: Windows, Mac OS X, Unix.
+Availability: Windows, Mac OS X, Unix, Solaris. Not available on GNU/Hurd.
 
 Pseudo-code [#pseudo]_::
 
@@ -710,18 +721,18 @@
 
 Examples of clock precision on x86_64:
 
-=========================  ================  ===============
-Name                       Operating system  Precision
-=========================  ================  ===============
-CLOCK_MONOTONIC_RAW        Linux 3.2                    1 ns
-CLOCK_MONOTONIC            Linux 3.2                    1 ns
-CLOCK_HIGHRES              SunOS 5.11                   2 ns
-CLOCK_MONOTONIC            SunOS 5.11                   2 ns
-QueryPerformanceCounter    Windows Seven               10 ns
-CLOCK_MONOTONIC            FreeBSD 8.2                 11 ns
-CLOCK_MONOTONIC            OpenBSD 5.0                 10 ms
-GetTickCount               Windows Seven             15.6 ms
-=========================  ================  ===============
+=========================  ================  =========  ===================
+Name                       Operating system  Precision  Precision in Python
+=========================  ================  =========  ===================
+CLOCK_MONOTONIC_RAW        Linux 3.2              1 ns               3.0 µs
+CLOCK_MONOTONIC            Linux 3.2              1 ns               1.6 µs
+CLOCK_HIGHRES              SunOS 5.11             2 ns                    ?
+CLOCK_MONOTONIC            SunOS 5.11             2 ns                    ?
+QueryPerformanceCounter    Windows Seven         10 ns                    ?
+CLOCK_MONOTONIC            FreeBSD 8.2           11 ns                    ?
+CLOCK_MONOTONIC            OpenBSD 5.0           10 ms                    ?
+GetTickCount               Windows Seven       15.6 ms                    ?
+=========================  ================  =========  ===================
 
 For CLOCK_xxx clocks, the precision of this table is the result of
 ``clock_getres()``.  It looks like Linux does not implement ``clock_getres()``
@@ -886,8 +897,6 @@
 WaitForSingleObject() uses the same timer as GetTickCount() with the
 same precision.
 
-GetTickCount() has an precision of 55 ms on Windows 9x.
-
 
 Windows: timeGetTime
 ^^^^^^^^^^^^^^^^^^^^
@@ -962,15 +971,15 @@
 
 Examples of clock precision on x86_64:
 
-=========================  ================  ===============
-Name                       Operating system  Precision
-=========================  ================  ===============
-CLOCK_REALTIME             Linux 3.2         1 ns
-CLOCK_REALTIME             FreeBSD 8.2       11 ns
-CLOCK_REALTIME             SunOS 5.11        10 ms
-CLOCK_REALTIME             OpenBSD 5.0       10 ms
-GetSystemTimeAsFileTime    Windows Seven     15.6 ms
-=========================  ================  ===============
+=========================  ================  =========  ===================
+Name                       Operating system  Precision  Precision in Python
+=========================  ================  =========  ===================
+CLOCK_REALTIME             Linux 3.2              1 ns               1.9 µs
+CLOCK_REALTIME             FreeBSD 8.2           11 ns                    ?
+CLOCK_REALTIME             SunOS 5.11            10 ms                    ?
+CLOCK_REALTIME             OpenBSD 5.0           10 ms                    ?
+GetSystemTimeAsFileTime    Windows Seven       15.6 ms                    ?
+=========================  ================  =========  ===================
 
 For CLOCK_REALTIME, the precision of this table is the result of
 clock_getres().  It looks like Linux does not implement clock_getres()
@@ -1030,18 +1039,18 @@
 
 Examples of clock precision on x86_64:
 
-=========================  ================  ===============
-Name                       Operating system  Precision
-=========================  ================  ===============
-CLOCK_PROCESS_CPUTIME_ID   Linux 3.2                    1 ns
-clock()                    SunOS 5.11                   1 µs
-getrusage()                Linux 3.0                    4 ms
-clock()                    FreeBSD 8.2                7.8 ms
-clock()                    Linux 3.2                   10 ms
-times()                    Linux 3.0                   10 ms
-clock()                    OpenBSD 5.0                 10 ms
-GetProcessTimes()          Windows Seven             15.6 ms
-=========================  ================  ===============
+=========================  ================  =========  ===================
+Name                       Operating system  Precision  Precision in Python
+=========================  ================  =========  ===================
+CLOCK_PROCESS_CPUTIME_ID   Linux 3.2              1 ns               3.3 µs
+clock()                    SunOS 5.11             1 µs                    ?
+getrusage()                Linux 3.0              4 ms                 4 ms
+clock()                    FreeBSD 8.2          7.8 ms                    ?
+clock()                    Linux 3.2              1 µs                10 ms
+times()                    Linux 3.0             10 ms                10 ms
+clock()                    OpenBSD 5.0           10 ms                    ?
+GetProcessTimes()          Windows Seven       15.6 ms                    ?
+=========================  ================  =========  ===================
 
 The precision of clock() in this table is the result of 1 /
 CLOCKS_PER_SEC. The precision of times() in this table is the result of 1 /
@@ -1090,13 +1099,13 @@
 
 Examples of clock precision on x86_64:
 
-=========================  ================  ===============
-Name                       Operating system  Precision
-=========================  ================  ===============
-CLOCK_THREAD_CPUTIME_ID    Linux 3.2         1 ns
-CLOCK_THREAD_CPUTIME_ID    FreeBSD 8.2       1 µs
-GetThreadTimes()           Windows Seven     15.6 ms
-=========================  ================  ===============
+=========================  ================  ===============  ===================
+Name                       Operating system  Precision        Precision in Python
+=========================  ================  ===============  ===================
+CLOCK_THREAD_CPUTIME_ID    Linux 3.2                    1 ns                    ?
+CLOCK_THREAD_CPUTIME_ID    FreeBSD 8.2                  1 µs                    ?
+GetThreadTimes()           Windows Seven             15.6 ms                    ?
+=========================  ================  ===============  ===================
 
 For CLOCK_THREAD_CPUTIME_ID, the precision of this table is the result
 of clock_getres().  It looks like Linux does not implement
diff --git a/pep-0418/clock_precision.py b/pep-0418/clock_precision.py
new file mode 100644
--- /dev/null
+++ b/pep-0418/clock_precision.py
@@ -0,0 +1,55 @@
+import time
+
+def compute_precision(func):
+    previous = func()
+    precision = None
+    points = 0
+    min_points = 100
+    while points < min_points:
+        value = func()
+        if value == previous:
+            continue
+        dt = value - previous
+        previous = value
+        if precision is not None:
+            precision = min(precision, dt)
+        else:
+            precision = dt
+        if precision < 10e-6:
+            min_points = 5000
+        elif precision < 1e-3:
+            min_points = 1000
+        points += 1
+    return dt
+
+def format_duration(dt):
+    if dt >= 1e-3:
+        return "%.1f ms" % (dt * 1e3)
+    if dt >= 1e-6:
+        return "%.1f µs" % (dt * 1e6)
+    else:
+        return "%.1f ns" % (dt * 1e9)
+
+def test_clock(name, func):
+    precision = compute_precision(func)
+    print("%s:" % name)
+    print("- precision in Python: %s" % format_duration(precision))
+
+
+for name in ('clock', 'perf_counter', 'process_time', 'monotonic', 'time'):
+    func = getattr(time, name)
+    test_clock("%s()" % name, func)
+    info = time.get_clock_info(name)
+    if 'precision' in info:
+        print("- announced precision: %s" % format_duration(info['precision']))
+    print("- function: %s" % info['function'])
+    print("- resolution: %s" % format_duration(info['resolution']))
+
+clock_ids = [name for name in dir(time) if name.startswith("CLOCK_")]
+for clock_id_text in clock_ids:
+    clock_id = getattr(time, clock_id_text)
+    name = 'clock_gettime(%s)' % clock_id_text
+    def gettime():
+        return time.clock_gettime(clock_id)
+    test_clock(name, gettime)
+

-- 
Repository URL: http://hg.python.org/peps


More information about the Python-checkins mailing list