classification
Title: timeit called from within Python should allow autoranging
Type: enhancement Stage: needs patch
Components: Library (Lib) Versions: Python 3.4
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: amaury.forgeotdarc Nosy List: amaury.forgeotdarc, asvetlov, eric.araujo, haypo, ncoghlan, pitrou, rhettinger, scott_daniels, tshepang
Priority: normal Keywords: patch

Created on 2009-07-05 15:15 by scott_daniels, last changed 2012-08-21 18:47 by pitrou.

Files
File name Uploaded Description Edit
timeit.patch scott_daniels, 2009-07-08 16:19 Patch including changes to timeit, test, and doc
Messages (12)
msg90157 - (view) Author: Scott David Daniels (scott_daniels) * Date: 2009-07-05 15:15
timeit.main has a _very_ handy autoranging facility to pick an
appropriate number of repetitions when not specified.  The autoranging
code should be lifted to a method on Timer instances (so non-main code
can use it).  If number is specified as 0 or None, I would like to use
the results of that autoranging code in Timer.repeat and Timer.timeit.

Patch to follow.
msg90245 - (view) Author: Scott David Daniels (scott_daniels) * Date: 2009-07-07 21:29
I've got the code "working" on trunk2 for my tests.
Should I port to py3K before checking in, and give diffs from there, or 
what?
msg90264 - (view) Author: Amaury Forgeot d'Arc (amaury.forgeotdarc) * (Python committer) Date: 2009-07-08 12:01
You can still upload available patches to this tracker.
msg90275 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2009-07-08 17:05
I would like to look at this in context of all the other proposed build-
outs to timeit.
msg122955 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2010-11-30 23:33
This does not conflict with the other proposed changes to timeit and it is in-line with Guido's desire that to expose useful parts currently buried in the command-line logic.

Amaury, you've shown an interest.  Would you like to apply it?
msg123711 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2010-12-09 23:27
Not sure why you chose 0.11 here. It should probably be 0.2 as in the command-line code.
As for applying the patch, this can't be done before 3.2 is released.
msg164027 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2012-06-26 02:40
Looking at this again after more time has passes, I still think exposing autoranging is a good idea but I don't like the patch as it stands.  It "infects" the API in a number of places and makes the overall module harder to use and learn.   

Ideally, there should be a cleaner interface, or more limited API change, or a separate high level function that can autorange existing functions without changing their API.

Anyone care to propose a cleaner API?
msg164070 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2012-06-26 12:37
In #5442, I proposed leaving the architecture of the module alone, and simply exposing the main module functionality as a high level helper function:

def measure(stmt="pass", setup="pass", timer=default_timer,
            repeat=default_repeat, number=default_number,
            verbosity=0, precision=3)

The return value would simply be a (number, results) 2-tuple with the number of iterations per test (which may have been calculated automatically), and then a list of the results. To get "timeit" style behavior, simply set "repeat=1".
msg164071 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2012-06-26 12:39
Oops, that link reference should have been to #5441.
msg164216 - (view) Author: STINNER Victor (haypo) * (Python committer) Date: 2012-06-28 00:46
Hi, I wrote recently a similar function because timeit is not reliable by default. Results look random and require to run the same benchmark 3 times or more on the command line.

https://bitbucket.org/haypo/misc/src/tip/python/benchmark.py

By default, the benchmark takes at least 5 measures, one measure should be greater than 100 ms, and the benchmark should not be longer than 1 second. I chose these parameters to get reliable results on microbenchmarks like "abc".encode("utf-8").

The calibration function uses also the precision of the timer. The user may define a minimum time (of one measure) smaller than the timer precision, so the calibration function tries to solve such issue. The calibration computes the number of loops and the number of repetitions.

Look at BenchmarkRunner.calibrate_timer() and BenchmarkRunner.run_benchmark().
https://bitbucket.org/haypo/misc/src/bfacfb9a1224/python/benchmark.py#cl-362
msg164217 - (view) Author: STINNER Victor (haypo) * (Python committer) Date: 2012-06-28 00:55
> The calibration function uses also the precision of the timer.

Oh, I forgot to mention that it computes the precision in Python, it doesn't read the precision announced by the OS or the precision of the C structure.
https://bitbucket.org/haypo/misc/src/bfacfb9a1224/python/benchmark.py#cl-66
msg168796 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2012-08-21 18:47
> In #5442, I proposed leaving the architecture of the module alone, and 
> simply exposing the main module functionality as a high level helper
> function:

Agreed with Nick's approach above.

Victor, if you want to improve timeit's reliability, please open a separate issue.
History
Date User Action Args
2012-08-21 18:47:53pitrousetmessages: + msg168796
stage: patch review -> needs patch
2012-08-21 18:43:34asvetlovsetnosy: + asvetlov
2012-06-28 00:55:25hayposetmessages: + msg164217
2012-06-28 00:46:08hayposetnosy: + haypo
messages: + msg164216
2012-06-26 12:45:07ncoghlansetresolution: accepted ->
2012-06-26 12:39:27ncoghlansetmessages: + msg164071
2012-06-26 12:37:40ncoghlansetnosy: + ncoghlan
messages: + msg164070
2012-06-26 12:28:00ncoghlanlinkissue5441 superseder
2012-06-26 02:40:21rhettingersetmessages: + msg164027
versions: + Python 3.4, - Python 3.3
2012-06-25 17:55:52tshepangsetnosy: + tshepang
2010-12-09 23:27:16pitrousetnosy: + pitrou

messages: + msg123711
stage: test needed -> patch review
2010-12-09 15:55:41eric.araujosetnosy: + eric.araujo

versions: + Python 3.3, - Python 3.2
2010-11-30 23:33:22rhettingersetassignee: rhettinger -> amaury.forgeotdarc
resolution: accepted
messages: + msg122955
versions: - Python 2.7
2009-07-08 17:05:43rhettingersetassignee: rhettinger

messages: + msg90275
nosy: + rhettinger
2009-07-08 16:19:53scott_danielssetfiles: + timeit.patch
keywords: + patch
2009-07-08 12:01:49amaury.forgeotdarcsetnosy: + amaury.forgeotdarc
messages: + msg90264
2009-07-07 21:29:29scott_danielssetmessages: + msg90245
2009-07-07 09:25:47ezio.melottisetpriority: normal
stage: test needed
2009-07-05 15:15:10scott_danielscreate