Package: codetiming
codetiming- A flexible, customizable timer for your Python codeInstallcodetimingfrom PyPI:$ python -m pip install codetimingThe source code isavailable on GitHub.For a complete tutorial oncodetiming, seePython Timer Functions: Three Ways to Monitor Your CodeonReal Python.Basic UsageYou can usecodetiming.Timerin several different ways:As aclass:t=Timer(name="class")t.start()# Do somethingt.stop()As acontext manager:withTimer(name="context manager"):# Do somethingAs adecorator:@Timer(name="decorator")defstuff():# Do somethingArgumentsTimeraccepts the following arguments when it's created. All arguments are optional:name:An optional name for your timertext:The text that's shown when your timer ends. It should contain a{}placeholder that will be filled by the elapsed time in seconds (default:"Elapsed time: {:.4f} seconds")initial_text:Show text when your timer starts. You may provide the string to be logged orTrueto show the default text"Timer {name} started"(default:False)logger:A function/callable that takes a string argument and will report the elapsed time when the logger is stopped (default:print())You can turn off explicit reporting of the elapsed time by settinglogger=None.In the template text, you can also use explicit attributes to refer to thenameof the timer or log the elapsed time inmilliseconds,seconds(the default), orminutes. For example:t1=Timer(name="NamedTimer",text="{name}:{minutes:.1f}minutes")t2=Timer(text="Elapsed time:{milliseconds:.0f}ms")Note that the strings used bytextarenotf-strings. Instead, they are used as templates that will be populated using.format()behind the scenes. If you want to combine thetexttemplate with an f-string, you need to use double braces for the template values:t=Timer(text=f"{__file__}:{{:.4f}}")textis also allowed to be a callable like a function or a class. Iftextis a callable, it is expected to require one argument: the number of seconds elapsed. It should return a text string that will be logged using logger:t=Timer(text=lambdasecs:f"{secs/86400:.0f}days")This allows you to use third-party libraries likehumanfriendlyto do the text formatting:fromhumanfriendlyimportformat_timespant1=Timer(text=format_timespan)t2=Timer(text=lambdasecs:f"Elapsed time:{format_timespan(secs)}")You may include a text that should be logged when the timer starts by settinginitial_text:t=Timer(initial_text="And so it begins ...")You can also setinitial_text=Trueto use a default initial text.Capturing the Elapsed TimeWhen usingTimeras a class, you can capture the elapsed time when calling.stop():elapsed_time=t.stop()You can also find the last measured elapsed time in the.lastattribute. The following code will have the same effect as the previous example:t.stop()elapsed_time=t.lastNamed TimersNamed timers are made available in the class dictionaryTimer.timers. The elapsed time will accumulate if the same name or same timer is used several times. Consider the following example:>>>importlogging>>>fromcodetimingimportTimer>>>t=Timer("example",text="Time spent:{:.2f}",logger=logging.warning)>>>t.start()>>>t.stop()WARNING:root:Time spent: 3.583.5836678670002584>>>witht:..._=list(range(100_000_000))...WARNING:root:Time spent: 1.73>>>Timer.timers{'example': 5.312697440000193}The example shows how you can redirect the timer output to the logging module. Note that the elapsed time spent in the two different uses ofthas been accumulated inTimer.timers.You can also get simple statistics about your named timers. Continuing from the example above:>>>Timer.timers.max("example")3.5836678670002584>>>Timer.timers.mean("example")2.6563487200000964>>>Timer.timers.stdev("example")1.311427314335879timerssupport.count(),.total(),.min(),.max(),.mean(),.median(), and.stdev().Acknowledgmentscodetimingis based on a similar module initially developed for theMidgard Geodesy libraryat theNorwegian Mapping Authority.