5959default_number = 1000000
6060default_repeat = 5
6161default_timer = time .perf_counter
62+ default_time_taken = 0.2
6263
6364_globals = globals
6465
@@ -75,10 +76,12 @@ def inner(_it, _timer{init}):
7576 return _t1 - _t0
7677"""
7778
79+
7880def reindent (src , indent ):
7981 """Helper to reindent a multi-line statement."""
8082 return src .replace ("\n " , "\n " + " " * indent )
8183
84+
8285class Timer :
8386 """Class for timing execution speed of small code snippets.
8487
@@ -98,9 +101,10 @@ class Timer:
98101 """
99102
100103 def __init__ (self , stmt = "pass" , setup = "pass" , timer = default_timer ,
101- globals = None ):
104+ globals = None , max_time_taken = default_time_taken ):
102105 """Constructor. See class doc string."""
103106 self .timer = timer
107+ self .max_time_taken = max_time_taken
104108 local_ns = {}
105109 global_ns = _globals () if globals is None else globals
106110 init = ''
@@ -169,6 +173,8 @@ def timeit(self, number=default_number):
169173 to one million. The main statement, the setup statement and
170174 the timer function to be used are passed to the constructor.
171175 """
176+ if not number :
177+ return self .autorange ()
172178 it = itertools .repeat (None , number )
173179 gcold = gc .isenabled ()
174180 gc .disable ()
@@ -206,11 +212,12 @@ def repeat(self, repeat=default_repeat, number=default_number):
206212 return r
207213
208214 def autorange (self , callback = None ):
209- """Return the number of loops and time taken so that total time >= 0.2.
215+ """Return the number of loops and time taken so that total time >= max_time_taken
216+ (default is 0.2 seconds).
210217
211218 Calls the timeit method with increasing numbers from the sequence
212- 1, 2, 5, 10, 20, 50, ... until the time taken is at least 0.2
213- second. Returns (number, time_taken).
219+ 1, 2, 5, 10, 20, 50, ... until the max_time_taken is reached.
220+ Returns (number, time_taken).
214221
215222 If *callback* is given and is not None, it will be called after
216223 each trial with two arguments: ``callback(number, time_taken)``.
@@ -222,19 +229,22 @@ def autorange(self, callback=None):
222229 time_taken = self .timeit (number )
223230 if callback :
224231 callback (number , time_taken )
225- if time_taken >= 0.2 :
232+ if time_taken >= self . max_time_taken :
226233 return (number , time_taken )
227234 i *= 10
228235
236+
229237def timeit (stmt = "pass" , setup = "pass" , timer = default_timer ,
230- number = default_number , globals = None ):
238+ number = default_number , globals = None , max_time_taken = default_time_taken ):
231239 """Convenience function to create Timer object and call timeit method."""
232- return Timer (stmt , setup , timer , globals ).timeit (number )
240+ return Timer (stmt , setup , timer , globals , max_time_taken ).timeit (number )
241+
233242
234243def repeat (stmt = "pass" , setup = "pass" , timer = default_timer ,
235- repeat = default_repeat , number = default_number , globals = None ):
244+ repeat = default_repeat , number = default_number , globals = None , max_time_taken = default_time_taken ):
236245 """Convenience function to create Timer object and call repeat method."""
237- return Timer (stmt , setup , timer , globals ).repeat (repeat , number )
246+ return Timer (stmt , setup , timer , globals , max_time_taken ).repeat (repeat , number )
247+
238248
239249def main (args = None , * , _wrap_timer = None ):
240250 """Main program, used when run as a script.
@@ -259,7 +269,7 @@ def main(args=None, *, _wrap_timer=None):
259269 try :
260270 opts , args = getopt .getopt (args , "n:u:s:r:tcpvh" ,
261271 ["number=" , "setup=" , "repeat=" ,
262- "time" , "clock" , "process" ,
272+ "time" , "clock" , "process" , "max_time_taken="
263273 "verbose" , "unit=" , "help" ])
264274 except getopt .error as err :
265275 print (err )
@@ -269,6 +279,7 @@ def main(args=None, *, _wrap_timer=None):
269279 timer = default_timer
270280 stmt = "\n " .join (args ) or "pass"
271281 number = 0 # auto-determine
282+ max_time_taken = default_time_taken
272283 setup = []
273284 repeat = default_repeat
274285 verbose = 0
@@ -293,6 +304,8 @@ def main(args=None, *, _wrap_timer=None):
293304 repeat = 1
294305 if o in ("-p" , "--process" ):
295306 timer = time .process_time
307+ if o in ("-m" , "--max_time_taken" ):
308+ max_time_taken = a
296309 if o in ("-v" , "--verbose" ):
297310 if verbose :
298311 precision += 1
@@ -310,7 +323,7 @@ def main(args=None, *, _wrap_timer=None):
310323 if _wrap_timer is not None :
311324 timer = _wrap_timer (timer )
312325
313- t = Timer (stmt , setup , timer )
326+ t = Timer (stmt , setup , timer , max_time_taken = max_time_taken )
314327 if number == 0 :
315328 # determine number so that 0.2 <= total time < 2.0
316329 callback = None
@@ -370,5 +383,6 @@ def format_time(dt):
370383 UserWarning , '' , 0 )
371384 return None
372385
386+
373387if __name__ == "__main__" :
374388 sys .exit (main ())
0 commit comments