Source code for pytimings.tools
import atexit
import os
import time
from functools import partial
from pathlib import Path
from typing import Optional, Union
[docs]
def ensure_directory_exists(dirname):
"""create dirname if it doesn't exist"""
try:
os.makedirs(dirname) # noqa: PTH103
except FileExistsError:
pass
[docs]
def output_at_exit(
output_dir: Optional[Union[str, Path]] = None,
csv_base="timings",
timings=None,
files=True,
console=True,
) -> None:
"""Register output methods to be executed at Python interpreter exit
files: set to False to not write csv files to disk
console: set to False to not display console output for timing sections
csv_base: filename stem for csv outputs
output_dir: directory for csv outputs, defaults to current working directory
"""
from pytimings.timer import global_timings
timings = timings or global_timings
if files:
output_dir = output_dir or os.getcwd() # noqa: PTH109
output_dir = Path(output_dir)
ensure_directory_exists(output_dir)
output = partial(timings.output_files, output_dir=output_dir, csv_base=csv_base)
atexit.register(output)
if console:
atexit.register(timings.output_console)
[docs]
def busywait(secs):
"""busywait simulates load, so user time won't be 0 in timings"""
init_time = time.time()
while time.time() < init_time + secs:
pass
return time.time() - init_time
[docs]
def generate_example_data(output_dir, number_of_runs=10):
from pytimings.timer import Timings, scoped_timing
files = []
for i in range(1, number_of_runs):
timings = Timings()
timings.add_extra_data({"run": i})
with scoped_timing("linear", timings=timings):
busywait(number_of_runs / 10 / i)
with scoped_timing("quadratic", timings=timings):
busywait(number_of_runs / 10 / i**2)
files.append(timings.output_files(output_dir=output_dir, csv_base=f"example_speedup_{i:05}"))
return files