Skip to content

Commit 1b90115

Browse files
committed
timeit: change default repeat to 5, instead of 3
Issue #28240: timeit now repeats the benchmarks 5 times instead of only 3 to make benchmarks more reliable.
1 parent f8fb82c commit 1b90115

File tree

3 files changed

+21
-18
lines changed

3 files changed

+21
-18
lines changed

Lib/test/test_timeit.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
DEFAULT_NUMBER = 1000000
1313

1414
# timeit's default number of repetitions.
15-
DEFAULT_REPEAT = 3
15+
DEFAULT_REPEAT = 5
1616

1717
# XXX: some tests are commented out that would improve the coverage but take a
1818
# long time to run because they test the default number of loops, which is
@@ -226,7 +226,7 @@ def test_print_exc(self):
226226
t.print_exc(s)
227227
self.assert_exc_string(s.getvalue(), 'ZeroDivisionError')
228228

229-
MAIN_DEFAULT_OUTPUT = "1 loop, best of 3: 1 sec per loop\n"
229+
MAIN_DEFAULT_OUTPUT = "1 loop, best of 5: 1 sec per loop\n"
230230

231231
def run_main(self, seconds_per_increment=1.0, switches=None, timer=None):
232232
if timer is None:
@@ -252,31 +252,31 @@ def test_main_bad_switch(self):
252252

253253
def test_main_seconds(self):
254254
s = self.run_main(seconds_per_increment=5.5)
255-
self.assertEqual(s, "1 loop, best of 3: 5.5 sec per loop\n")
255+
self.assertEqual(s, "1 loop, best of 5: 5.5 sec per loop\n")
256256

257257
def test_main_milliseconds(self):
258258
s = self.run_main(seconds_per_increment=0.0055)
259-
self.assertEqual(s, "100 loops, best of 3: 5.5 msec per loop\n")
259+
self.assertEqual(s, "100 loops, best of 5: 5.5 msec per loop\n")
260260

261261
def test_main_microseconds(self):
262262
s = self.run_main(seconds_per_increment=0.0000025, switches=['-n100'])
263-
self.assertEqual(s, "100 loops, best of 3: 2.5 usec per loop\n")
263+
self.assertEqual(s, "100 loops, best of 5: 2.5 usec per loop\n")
264264

265265
def test_main_fixed_iters(self):
266266
s = self.run_main(seconds_per_increment=2.0, switches=['-n35'])
267-
self.assertEqual(s, "35 loops, best of 3: 2 sec per loop\n")
267+
self.assertEqual(s, "35 loops, best of 5: 2 sec per loop\n")
268268

269269
def test_main_setup(self):
270270
s = self.run_main(seconds_per_increment=2.0,
271271
switches=['-n35', '-s', 'print("CustomSetup")'])
272-
self.assertEqual(s, "CustomSetup\n" * 3 +
273-
"35 loops, best of 3: 2 sec per loop\n")
272+
self.assertEqual(s, "CustomSetup\n" * DEFAULT_REPEAT +
273+
"35 loops, best of 5: 2 sec per loop\n")
274274

275275
def test_main_multiple_setups(self):
276276
s = self.run_main(seconds_per_increment=2.0,
277277
switches=['-n35', '-s', 'a = "CustomSetup"', '-s', 'print(a)'])
278-
self.assertEqual(s, "CustomSetup\n" * 3 +
279-
"35 loops, best of 3: 2 sec per loop\n")
278+
self.assertEqual(s, "CustomSetup\n" * DEFAULT_REPEAT +
279+
"35 loops, best of 5: 2 sec per loop\n")
280280

281281
def test_main_fixed_reps(self):
282282
s = self.run_main(seconds_per_increment=60.0, switches=['-r9'])
@@ -309,8 +309,8 @@ def test_main_verbose(self):
309309
s = self.run_main(switches=['-v'])
310310
self.assertEqual(s, dedent("""\
311311
1 loop -> 1 secs
312-
raw times: 1 1 1
313-
1 loop, best of 3: 1 sec per loop
312+
raw times: 1 1 1 1 1
313+
1 loop, best of 5: 1 sec per loop
314314
"""))
315315

316316
def test_main_very_verbose(self):
@@ -321,23 +321,23 @@ def test_main_very_verbose(self):
321321
100 loops -> 0.005 secs
322322
1000 loops -> 0.05 secs
323323
10000 loops -> 0.5 secs
324-
raw times: 0.5 0.5 0.5
325-
10000 loops, best of 3: 50 usec per loop
324+
raw times: 0.5 0.5 0.5 0.5 0.5
325+
10000 loops, best of 5: 50 usec per loop
326326
"""))
327327

328328
def test_main_with_time_unit(self):
329329
unit_sec = self.run_main(seconds_per_increment=0.002,
330330
switches=['-u', 'sec'])
331331
self.assertEqual(unit_sec,
332-
"100 loops, best of 3: 0.002 sec per loop\n")
332+
"100 loops, best of 5: 0.002 sec per loop\n")
333333
unit_msec = self.run_main(seconds_per_increment=0.002,
334334
switches=['-u', 'msec'])
335335
self.assertEqual(unit_msec,
336-
"100 loops, best of 3: 2 msec per loop\n")
336+
"100 loops, best of 5: 2 msec per loop\n")
337337
unit_usec = self.run_main(seconds_per_increment=0.002,
338338
switches=['-u', 'usec'])
339339
self.assertEqual(unit_usec,
340-
"100 loops, best of 3: 2e+03 usec per loop\n")
340+
"100 loops, best of 5: 2e+03 usec per loop\n")
341341
# Test invalid unit input
342342
with captured_stderr() as error_stringio:
343343
invalid = self.run_main(seconds_per_increment=0.002,

Lib/timeit.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959

6060
dummy_src_name = "<timeit-src>"
6161
default_number = 1000000
62-
default_repeat = 3
62+
default_repeat = 5
6363
default_timer = time.perf_counter
6464

6565
_globals = globals

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ Core and Builtins
8888
Library
8989
-------
9090

91+
- Issue #28240: timeit now repeats the benchmarks 5 times instead of only 3
92+
to make benchmarks more reliable.
93+
9194
- Issue #28240: timeit autorange now uses a single loop iteration if the
9295
benchmark takes less than 10 seconds, instead of 10 iterations.
9396
"python3 -m timeit -s 'import time' 'time.sleep(1)'" now takes 4 seconds

0 commit comments

Comments
 (0)