66import numpy as np
77
88
9- class _RunTimer :
10- """Internal context manager for individual run timing."""
11-
12- def __init__ (self , parent_timer ):
13- self .parent = parent_timer
14- self ._start_time = None
15-
16- def __enter__ (self ):
17- self ._start_time = time .time ()
18- return self
19-
20- def __exit__ (self , exc_type , exc_val , exc_tb ):
21- end_time = time .time ()
22- run_time = end_time - self ._start_time
23- run_number = len (self .parent ._run_times ) + 1
24-
25- self .parent ._run_times .append (run_time )
26-
27- if not self .parent .silent :
28- self .parent ._print_single_run (run_number , run_time )
29-
309
3110class __Timer__ :
3211 """Computes elapsed time, between tic, tac, and toc.
@@ -249,11 +228,11 @@ class Timer:
249228 >>> print(f"Average: {timer.average:.4f}s")
250229 Average: 0.0101s
251230
252- Multiple runs with context manager and manual timing :
253- >>> with Timer(runs=3) as timer :
254- ... for i in range(3):
255- ... with timer.time_run():
256- ... time.sleep(0.01 )
231+ Multiple runs with callable :
232+ >>> def my_function() :
233+ ... time.sleep(0.01)
234+ >>> timer = Timer(runs=3)
235+ >>> timer.timeit(my_function )
257236 Run 1/3: 0.01 seconds
258237 Run 2/3: 0.01 seconds
259238 Run 3/3: 0.01 seconds
@@ -271,7 +250,6 @@ def __init__(self, message="", precision=2, unit="seconds", silent=False, runs=1
271250 self .maximum = None
272251 self .average = None
273252 self ._start_time = None
274- self ._run_times = []
275253
276254 # Validate unit
277255 valid_units = ["seconds" , "milliseconds" , "microseconds" ]
@@ -283,13 +261,8 @@ def __init__(self, message="", precision=2, unit="seconds", silent=False, runs=1
283261 raise ValueError ("runs must be a positive integer" )
284262
285263 def __enter__ (self ):
286- if self .runs == 1 :
287- # Single run mode - start timing immediately
288- self ._start_time = time .time ()
289- return self
290- else :
291- # Multiple runs mode - don't start timing until timeit() is called
292- return self
264+ self ._start_time = time .time ()
265+ return self
293266
294267 def __exit__ (self , exc_type , exc_val , exc_tb ):
295268 if self .runs == 1 :
@@ -300,15 +273,8 @@ def __exit__(self, exc_type, exc_val, exc_tb):
300273 if not self .silent :
301274 self ._print_elapsed ()
302275 else :
303- # Multiple runs mode - print summary if runs were completed
304- if len (self ._run_times ) == self .runs :
305- self .elapsed = self ._run_times .copy ()
306- self .minimum = min (self ._run_times )
307- self .maximum = max (self ._run_times )
308- self .average = sum (self ._run_times ) / len (self ._run_times )
309-
310- if not self .silent :
311- self ._print_multiple_runs_summary ()
276+ # Multiple runs mode - context manager not supported, only timeit()
277+ raise RuntimeError ("Context manager usage is only supported for single runs (runs=1). For multiple runs, use the timeit() method." )
312278
313279 def timeit (self , func , * args , ** kwargs ):
314280 """
@@ -349,31 +315,7 @@ def timeit(self, func, *args, **kwargs):
349315
350316 if not self .silent :
351317 self ._print_multiple_runs_summary ()
352-
353- def time_run (self ):
354- """
355- Context manager for timing individual runs in multiple runs mode.
356- Only available when runs > 1.
357-
358- Returns
359- -------
360- _RunTimer
361- A context manager for timing a single run
362-
363- Examples
364- --------
365- >>> with Timer(runs=3, silent=True) as timer:
366- ... for i in range(3):
367- ... with timer.time_run():
368- ... time.sleep(0.01)
369- >>> len(timer.elapsed)
370- 3
371- """
372- if self .runs == 1 :
373- raise RuntimeError ("time_run() is only available when runs > 1. Use the Timer context manager directly for single runs." )
374-
375- return _RunTimer (self )
376-
318+
377319 def _print_single_run (self , run_number , run_time ):
378320 """Print timing for a single run in multiple runs mode."""
379321 # Convert to requested unit
0 commit comments