Skip to content

Commit f014a68

Browse files
Changes after first review by Steven
1 parent 901aceb commit f014a68

File tree

3 files changed

+42
-33
lines changed

3 files changed

+42
-33
lines changed

Doc/library/timeit.rst

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,36 +58,38 @@ Python Interface
5858
The module defines three convenience functions and a public class:
5959

6060

61-
.. function:: timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None, max_time_taken=0.2)
61+
.. function:: timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None, target_time=0.2)
6262

6363
Create a :class:`Timer` instance with the given statement, *setup* code and
6464
*timer* function and run its :meth:`.timeit` method with *number* executions.
6565
The optional *globals* argument specifies a namespace in which to execute the
6666
code. If *number* is 0, :meth:`.autorange` method is executed, a convenience
67-
function that calls :meth:`.timeit` repeatedly so that the total time >= *max_time_taken* second.
67+
function that calls :meth:`.timeit` repeatedly so that the total time >= *target_time* second.
6868

6969
.. versionchanged:: 3.5
7070
The optional *globals* parameter was added.
7171

7272
.. versionchanged:: 3.8
73-
The optional *max_time_taken* parameter was added.
73+
The optional *target_time* parameter was added.
7474

7575

76-
.. function:: repeat(stmt='pass', setup='pass', timer=<default timer>, repeat=5, number=1000000, globals=None, max_time_taken=0.2)
76+
.. function:: repeat(stmt='pass', setup='pass', timer=<default timer>, repeat=5, number=1000000, globals=None, target_time=0.2)
7777

7878
Create a :class:`Timer` instance with the given statement, *setup* code and
7979
*timer* function and run its :meth:`.repeat` method with the given *repeat*
8080
count and *number* executions. The optional *globals* argument specifies a
8181
namespace in which to execute the code. If *number* is 0, :meth:`.autorange`
8282
method is executed, a convenience function that calls :meth:`.timeit` repeatedly
83-
so that the total time >= *max_time_taken* second.
83+
so that the total time >= *target_time* second.
8484

8585
.. versionchanged:: 3.5
8686
The optional *globals* parameter was added.
8787

8888
.. versionchanged:: 3.7
8989
Default value of *repeat* changed from 3 to 5.
90-
The optional *max_time_taken* parameter was added.
90+
91+
.. versionchanged:: 3.8
92+
The optional *target_time* parameter was added.
9193

9294
.. function:: default_timer()
9395

@@ -97,7 +99,7 @@ The module defines three convenience functions and a public class:
9799
:func:`time.perf_counter` is now the default timer.
98100

99101

100-
.. class:: Timer(stmt='pass', setup='pass', timer=<timer function>, globals=None, max_time_taken=0.2)
102+
.. class:: Timer(stmt='pass', setup='pass', timer=<timer function>, globals=None, target_time=0.2)
101103

102104
Class for timing execution speed of small code snippets.
103105

@@ -124,7 +126,7 @@ The module defines three convenience functions and a public class:
124126
The optional *globals* parameter was added.
125127

126128
.. versionchanged:: 3.8
127-
The optional *max_time_taken* parameter was added.
129+
The optional *target_time* parameter was added.
128130

129131
.. method:: Timer.timeit(number=1000000)
130132

@@ -147,15 +149,15 @@ The module defines three convenience functions and a public class:
147149
timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()
148150

149151

150-
.. method:: Timer.autorange(callback=None)
152+
.. method:: Timer.autorange(callback=None, target_time=None)
151153

152154
Automatically determine how many times to call :meth:`.timeit`.
153155

154156
This is a convenience function that calls :meth:`.timeit` repeatedly
155-
so that the total time >= *Timer.max_time_taken* second, returning the eventual
157+
so that the total time >= *Timer.target_time* seconds, returning the eventual
156158
(number of loops, time taken for that number of loops). It calls
157159
:meth:`.timeit` with increasing numbers from the sequence 1, 2, 5,
158-
10, 20, 50, ... until the time taken is at least *max_time_taken* second.
160+
10, 20, 50, ... until the time taken is at least *target_time* seconds.
159161

160162
If *callback* is given and is not ``None``, it will be called after
161163
each trial with two arguments: ``callback(number, time_taken)``.
@@ -243,9 +245,9 @@ Where the following options are understood:
243245

244246
.. versionadded:: 3.5
245247

246-
.. cmdoption:: -m, --max_time_taken=M
248+
.. cmdoption:: -t, --target_time=T
247249

248-
calls :meth:`.timeit` repeatedly so that the total time >= *max_time_taken* second
250+
calls :meth:`.timeit` repeatedly so that the total time >= *target_time* seconds
249251

250252
.. versionadded:: 3.8
251253

Lib/test/test_timeit.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ def test_timeit_function_zero_iters(self):
143143

144144
def test_timeit_function_max_time_taken(self):
145145
delta_time = timeit.timeit(self.fake_stmt, self.fake_setup, number=0,
146-
timer=FakeTimer(), max_time_taken=1)
146+
timer=FakeTimer(), target_time=1)
147+
self.assertEqual(delta_time, (1, 1.0))
147148

148149
def test_timeit_globals_args(self):
149150
global _global_timer
@@ -156,9 +157,9 @@ def test_timeit_globals_args(self):
156157
timeit.timeit(stmt='local_timer.inc()', timer=local_timer,
157158
globals=locals(), number=3)
158159

159-
def repeat(self, stmt, setup, repeat=None, number=None, max_time_taken=0.5):
160+
def repeat(self, stmt, setup, repeat=None, number=None, target_time=0.5):
160161
self.fake_timer = FakeTimer()
161-
t = timeit.Timer(stmt=stmt, setup=setup, timer=self.fake_timer, max_time_taken=max_time_taken)
162+
t = timeit.Timer(stmt=stmt, setup=setup, timer=self.fake_timer, target_time=target_time)
162163
kwargs = {}
163164
if repeat is None:
164165
repeat = DEFAULT_REPEAT
@@ -192,7 +193,7 @@ def test_repeat_callable_stmt(self):
192193

193194
def test_repeat_callable_max_time_taken(self):
194195
self.repeat(self.fake_callable_stmt, self.fake_setup,
195-
repeat=3, number=5, max_time_taken=1)
196+
repeat=3, number=5, target_time=1)
196197

197198
def test_repeat_callable_setup(self):
198199
self.repeat(self.fake_stmt, self.fake_callable_setup,

Lib/timeit.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
-p/--process: use time.process_time() (default is time.perf_counter())
2020
-v/--verbose: print raw timing results; repeat for more digits precision
2121
-u/--unit: set the output time unit (nsec, usec, msec, or sec)
22+
-t/--target_time: if number is 0 the code will run until it
23+
takes *at least* ``target_time`` seconds
2224
-h/--help: print this usage message and exit
2325
--: separate options from statement, use when statement starts with -
2426
statement: statement to be timed (default 'pass')
@@ -59,7 +61,7 @@
5961
default_number = 1000000
6062
default_repeat = 5
6163
default_timer = time.perf_counter
62-
default_time_taken = 0.2
64+
default_target_time = 0.2
6365

6466
_globals = globals
6567

@@ -101,10 +103,10 @@ class Timer:
101103
"""
102104

103105
def __init__(self, stmt="pass", setup="pass", timer=default_timer,
104-
globals=None, max_time_taken=default_time_taken):
106+
globals=None, target_time=default_target_time):
105107
"""Constructor. See class doc string."""
106108
self.timer = timer
107-
self.max_time_taken = max_time_taken
109+
self.target_time = target_time
108110
local_ns = {}
109111
global_ns = _globals() if globals is None else globals
110112
init = ''
@@ -211,9 +213,9 @@ def repeat(self, repeat=default_repeat, number=default_number):
211213
r.append(t)
212214
return r
213215

214-
def autorange(self, callback=None):
215-
"""Return the number of loops and time taken so that total time >= max_time_taken
216-
(default is 0.2 seconds).
216+
def autorange(self, callback=None, target_time=None):
217+
"""Return the number of loops and time taken so that
218+
total time >= target_time (default is 0.2 seconds).
217219
218220
Calls the timeit method with increasing numbers from the sequence
219221
1, 2, 5, 10, 20, 50, ... until the max_time_taken is reached.
@@ -222,28 +224,32 @@ def autorange(self, callback=None):
222224
If *callback* is given and is not None, it will be called after
223225
each trial with two arguments: ``callback(number, time_taken)``.
224226
"""
227+
if target_time is None:
228+
target_time = self.target_time
225229
i = 1
226230
while True:
227231
for j in 1, 2, 5:
228232
number = i * j
229233
time_taken = self.timeit(number)
230234
if callback:
231235
callback(number, time_taken)
232-
if time_taken >= self.max_time_taken:
236+
if time_taken >= target_time:
233237
return (number, time_taken)
234238
i *= 10
235239

236240

237241
def timeit(stmt="pass", setup="pass", timer=default_timer,
238-
number=default_number, globals=None, max_time_taken=default_time_taken):
242+
number=default_number, globals=None,
243+
target_time=default_target_time):
239244
"""Convenience function to create Timer object and call timeit method."""
240-
return Timer(stmt, setup, timer, globals, max_time_taken).timeit(number)
245+
return Timer(stmt, setup, timer, globals, target_time).timeit(number)
241246

242247

243248
def repeat(stmt="pass", setup="pass", timer=default_timer,
244-
repeat=default_repeat, number=default_number, globals=None, max_time_taken=default_time_taken):
249+
repeat=default_repeat, number=default_number,
250+
globals=None, target_time=default_target_time):
245251
"""Convenience function to create Timer object and call repeat method."""
246-
return Timer(stmt, setup, timer, globals, max_time_taken).repeat(repeat, number)
252+
return Timer(stmt, setup, timer, globals, target_time).repeat(repeat, number)
247253

248254

249255
def main(args=None, *, _wrap_timer=None):
@@ -279,7 +285,7 @@ def main(args=None, *, _wrap_timer=None):
279285
timer = default_timer
280286
stmt = "\n".join(args) or "pass"
281287
number = 0 # auto-determine
282-
max_time_taken = default_time_taken
288+
target_time = default_target_time
283289
setup = []
284290
repeat = default_repeat
285291
verbose = 0
@@ -304,8 +310,8 @@ def main(args=None, *, _wrap_timer=None):
304310
repeat = 1
305311
if o in ("-p", "--process"):
306312
timer = time.process_time
307-
if o in ("-m", "--max_time_taken"):
308-
max_time_taken = a
313+
if o in ("-t", "--target_time"):
314+
target_time = a
309315
if o in ("-v", "--verbose"):
310316
if verbose:
311317
precision += 1
@@ -323,7 +329,7 @@ def main(args=None, *, _wrap_timer=None):
323329
if _wrap_timer is not None:
324330
timer = _wrap_timer(timer)
325331

326-
t = Timer(stmt, setup, timer, max_time_taken=max_time_taken)
332+
t = Timer(stmt, setup, timer, target_time=target_time)
327333
if number == 0:
328334
# determine number so that 0.2 <= total time < 2.0
329335
callback = None
@@ -334,7 +340,7 @@ def callback(number, time_taken):
334340
print(msg.format(num=number, s='s' if plural else '',
335341
secs=time_taken, prec=precision))
336342
try:
337-
number, _ = t.autorange(callback)
343+
number, _ = t.autorange(callback, target_time)
338344
except:
339345
t.print_exc()
340346
return 1

0 commit comments

Comments
 (0)