Commit 884d13a5 authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

time.clock() now emits a DeprecationWarning (GH-4020)

bpo-31803: time.clock() and time.get_clock_info('clock') now emit a
DeprecationWarning warning.

Replace time.clock() with time.perf_counter() in tests and demos.

Remove also hasattr(time, 'monotonic') in test_time since time.monotonic()
is now always available since Python 3.5.
parent de86073a
...@@ -575,7 +575,7 @@ procedure can be used to obtain a better constant for a given platform (see ...@@ -575,7 +575,7 @@ procedure can be used to obtain a better constant for a given platform (see
The method executes the number of Python calls given by the argument, directly The method executes the number of Python calls given by the argument, directly
and again under the profiler, measuring the time for both. It then computes the and again under the profiler, measuring the time for both. It then computes the
hidden overhead per profiler event, and returns that as a float. For example, hidden overhead per profiler event, and returns that as a float. For example,
on a 1.8Ghz Intel Core i5 running Mac OS X, and using Python's time.clock() as on a 1.8Ghz Intel Core i5 running Mac OS X, and using Python's time.process_time() as
the timer, the magical number is about 4.04e-6. the timer, the magical number is about 4.04e-6.
The object of this exercise is to get a fairly consistent result. If your The object of this exercise is to get a fairly consistent result. If your
......
...@@ -289,6 +289,9 @@ Functions ...@@ -289,6 +289,9 @@ Functions
.. function:: perf_counter() .. function:: perf_counter()
.. index::
single: benchmarking
Return the value (in fractional seconds) of a performance counter, i.e. a Return the value (in fractional seconds) of a performance counter, i.e. a
clock with the highest available resolution to measure a short duration. It clock with the highest available resolution to measure a short duration. It
does include time elapsed during sleep and is system-wide. The reference does include time elapsed during sleep and is system-wide. The reference
...@@ -300,6 +303,11 @@ Functions ...@@ -300,6 +303,11 @@ Functions
.. function:: process_time() .. function:: process_time()
.. index::
single: CPU time
single: processor time
single: benchmarking
Return the value (in fractional seconds) of the sum of the system and user Return the value (in fractional seconds) of the sum of the system and user
CPU time of the current process. It does not include time elapsed during CPU time of the current process. It does not include time elapsed during
sleep. It is process-wide by definition. The reference point of the sleep. It is process-wide by definition. The reference point of the
......
...@@ -241,7 +241,7 @@ class c_int_S(_SimpleCData): ...@@ -241,7 +241,7 @@ class c_int_S(_SimpleCData):
def run_test(rep, msg, func, arg=None): def run_test(rep, msg, func, arg=None):
## items = [None] * rep ## items = [None] * rep
items = range(rep) items = range(rep)
from time import clock from time import perf_counter as clock
if arg is not None: if arg is not None:
start = clock() start = clock()
for i in items: for i in items:
......
...@@ -194,7 +194,7 @@ class WStringTestCase(unittest.TestCase): ...@@ -194,7 +194,7 @@ class WStringTestCase(unittest.TestCase):
def run_test(rep, msg, func, arg): def run_test(rep, msg, func, arg):
items = range(rep) items = range(rep)
from time import clock from time import perf_counter as clock
start = clock() start = clock()
for i in items: for i in items:
func(arg); func(arg); func(arg); func(arg); func(arg) func(arg); func(arg); func(arg); func(arg); func(arg)
......
...@@ -195,7 +195,7 @@ class Profile: ...@@ -195,7 +195,7 @@ class Profile:
self.t = r[0] + r[1] - t # put back unrecorded delta self.t = r[0] + r[1] - t # put back unrecorded delta
# Dispatch routine for best timer program (return = scalar, fastest if # Dispatch routine for best timer program (return = scalar, fastest if
# an integer but float works too -- and time.clock() relies on that). # an integer but float works too -- and time.process_time() relies on that).
def trace_dispatch_i(self, frame, event, arg): def trace_dispatch_i(self, frame, event, arg):
timer = self.timer timer = self.timer
......
...@@ -9,6 +9,7 @@ import sysconfig ...@@ -9,6 +9,7 @@ import sysconfig
import time import time
import threading import threading
import unittest import unittest
import warnings
try: try:
import _testcapi import _testcapi
except ImportError: except ImportError:
...@@ -64,9 +65,11 @@ class TimeTestCase(unittest.TestCase): ...@@ -64,9 +65,11 @@ class TimeTestCase(unittest.TestCase):
self.assertTrue(info.adjustable) self.assertTrue(info.adjustable)
def test_clock(self): def test_clock(self):
time.clock() with self.assertWarns(DeprecationWarning):
time.clock()
info = time.get_clock_info('clock') with self.assertWarns(DeprecationWarning):
info = time.get_clock_info('clock')
self.assertTrue(info.monotonic) self.assertTrue(info.monotonic)
self.assertFalse(info.adjustable) self.assertFalse(info.adjustable)
...@@ -427,8 +430,6 @@ class TimeTestCase(unittest.TestCase): ...@@ -427,8 +430,6 @@ class TimeTestCase(unittest.TestCase):
pass pass
self.assertEqual(time.strftime('%Z', tt), tzname) self.assertEqual(time.strftime('%Z', tt), tzname)
@unittest.skipUnless(hasattr(time, 'monotonic'),
'need time.monotonic')
def test_monotonic(self): def test_monotonic(self):
# monotonic() should not go backward # monotonic() should not go backward
times = [time.monotonic() for n in range(100)] times = [time.monotonic() for n in range(100)]
...@@ -467,8 +468,6 @@ class TimeTestCase(unittest.TestCase): ...@@ -467,8 +468,6 @@ class TimeTestCase(unittest.TestCase):
self.assertTrue(info.monotonic) self.assertTrue(info.monotonic)
self.assertFalse(info.adjustable) self.assertFalse(info.adjustable)
@unittest.skipUnless(hasattr(time, 'monotonic'),
'need time.monotonic')
@unittest.skipUnless(hasattr(time, 'clock_settime'), @unittest.skipUnless(hasattr(time, 'clock_settime'),
'need time.clock_settime') 'need time.clock_settime')
def test_monotonic_settime(self): def test_monotonic_settime(self):
...@@ -506,12 +505,15 @@ class TimeTestCase(unittest.TestCase): ...@@ -506,12 +505,15 @@ class TimeTestCase(unittest.TestCase):
self.assertRaises(ValueError, time.ctime, float("nan")) self.assertRaises(ValueError, time.ctime, float("nan"))
def test_get_clock_info(self): def test_get_clock_info(self):
clocks = ['clock', 'perf_counter', 'process_time', 'time'] clocks = ['clock', 'monotonic', 'perf_counter', 'process_time', 'time']
if hasattr(time, 'monotonic'):
clocks.append('monotonic')
for name in clocks: for name in clocks:
info = time.get_clock_info(name) if name == 'clock':
with self.assertWarns(DeprecationWarning):
info = time.get_clock_info('clock')
else:
info = time.get_clock_info(name)
#self.assertIsInstance(info, dict) #self.assertIsInstance(info, dict)
self.assertIsInstance(info.implementation, str) self.assertIsInstance(info.implementation, str)
self.assertNotEqual(info.implementation, '') self.assertNotEqual(info.implementation, '')
......
...@@ -23,7 +23,7 @@ mode as fast as possible. ...@@ -23,7 +23,7 @@ mode as fast as possible.
""" """
from turtle import Turtle, mainloop from turtle import Turtle, mainloop
from time import clock from time import perf_counter as clock
# wrapper for any additional drawing routines # wrapper for any additional drawing routines
# that need to know about each other # that need to know about each other
......
...@@ -13,7 +13,7 @@ http://homepage.univie.ac.at/erich.neuwirth/ ...@@ -13,7 +13,7 @@ http://homepage.univie.ac.at/erich.neuwirth/
""" """
from turtle import Turtle, colormode, tracer, mainloop from turtle import Turtle, colormode, tracer, mainloop
from random import randrange from random import randrange
from time import clock from time import perf_counter as clock
def symRandom(n): def symRandom(n):
return randrange(-n,n+1) return randrange(-n,n+1)
......
...@@ -12,7 +12,7 @@ methods are taken from the PythonCard example ...@@ -12,7 +12,7 @@ methods are taken from the PythonCard example
scripts for turtle-graphics. scripts for turtle-graphics.
""" """
from turtle import * from turtle import *
from time import sleep, clock from time import sleep, perf_counter as clock
class CurvesTurtle(Pen): class CurvesTurtle(Pen):
# example derived from # example derived from
......
...@@ -17,7 +17,7 @@ For more information see: ...@@ -17,7 +17,7 @@ For more information see:
""" """
from turtle import * from turtle import *
from math import cos, pi from math import cos, pi
from time import clock, sleep from time import perf_counter as clock, sleep
f = (5**0.5-1)/2.0 # (sqrt(5)-1)/2 -- golden ratio f = (5**0.5-1)/2.0 # (sqrt(5)-1)/2 -- golden ratio
d = 2 * cos(3*pi/10) d = 2 * cos(3*pi/10)
......
...@@ -16,7 +16,7 @@ the current pen is cloned. So in the end ...@@ -16,7 +16,7 @@ the current pen is cloned. So in the end
there are 1024 turtles. there are 1024 turtles.
""" """
from turtle import Turtle, mainloop from turtle import Turtle, mainloop
from time import clock from time import perf_counter as clock
def tree(plist, l, a, f): def tree(plist, l, a, f):
""" plist is list of pens """ plist is list of pens
......
...@@ -14,7 +14,7 @@ parallel. ...@@ -14,7 +14,7 @@ parallel.
Followed by a complete undo(). Followed by a complete undo().
""" """
from turtle import Screen, Turtle, mainloop from turtle import Screen, Turtle, mainloop
from time import clock, sleep from time import perf_counter as clock, sleep
def mn_eck(p, ne,sz): def mn_eck(p, ne,sz):
turtlelist = [p] turtlelist = [p]
......
time.clock() and time.get_clock_info('clock') now emit a DeprecationWarning
warning.
...@@ -104,6 +104,13 @@ perf_counter(_Py_clock_info_t *info) ...@@ -104,6 +104,13 @@ perf_counter(_Py_clock_info_t *info)
static PyObject* static PyObject*
pyclock(_Py_clock_info_t *info) pyclock(_Py_clock_info_t *info)
{ {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"time.clock has been deprecated in Python 3.3 and will "
"be removed from Python 3.8: "
"use time.perf_counter or time.process_time "
"instead", 1) < 0) {
return NULL;
}
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
return perf_counter(info); return perf_counter(info);
#else #else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment