Source code for asv.benchmark

# Licensed under a 3-clause BSD style license - see LICENSE.rst
"""\
Usage: python -masv.benchmark COMMAND [...]

Manage a single benchmark and, when run from the commandline, report
its runtime to a file.

commands:

  timing [...]
      Run timing benchmark for given Python statement.

internal commands:

  discover BENCHMARK_DIR RESULT_FILE
      Discover benchmarks in a given directory and store result to a file.
  setup_cache BENCHMARK_DIR BENCHMARK_ID
      Run setup_cache for given benchmark.
  run BENCHMARK_DIR BENCHMARK_ID QUICK PROFILE_PATH RESULT_FILE
      Run a given benchmark, and store result in a file.
  run_server BENCHMARK_DIR SOCKET_FILENAME
      Run a Unix socket forkserver.
"""

import os
import sys

from asv_runner.check import _check
from asv_runner.discovery import _discover
from asv_runner.run import _run
from asv_runner.server import _run_server
from asv_runner.setup_cache import _setup_cache
from asv_runner.timing import _timing


[docs] def _help(args): print(__doc__)
[docs] commands = { 'discover': _discover, 'setup_cache': _setup_cache, 'run': _run, 'run_server': _run_server, 'check': _check, 'timing': _timing, '-h': _help, '--help': _help, }
[docs] def main(): # Remove asv package directory from `sys.path`. This script file resides # there although it's not part of the package, so Python prepends it to # `sys.path` on start which can shadow other modules. On Python 3.11+ it is # possible to use `PYTHONSAFEPATH` to prevent this, but the script needs to # work for older versions of Python. if ( not getattr(sys.flags, 'safe_path', False) # Python 3.11+ only. and sys.path[0] == os.path.dirname(os.path.abspath(__file__)) ): sys.path.pop(0) if len(sys.argv) < 2: _help([]) sys.exit(1) mode = sys.argv[1] args = sys.argv[2:] env = os.environ.copy() # --- Modify sys.path for the current interpreter --- if 'ASV_PYTHONPATH' in env: new_paths = env['ASV_PYTHONPATH'].split(os.pathsep) for path in reversed(new_paths): # Add to the front to prioritize if path not in sys.path: sys.path.insert(0, path) # Remove ASV_PYTHONPATH from env, as it's no longer needed after sys.path update env.pop('ASV_PYTHONPATH') else: # Clean up sys.path if PYTHONPATH was set but ASV_PYTHONPATH is not if 'PYTHONPATH' in env: old_paths = env['PYTHONPATH'].split(os.pathsep) for path in old_paths: if path in sys.path: sys.path.remove(path) env.pop('PYTHONPATH') if mode in commands: commands[mode](args) sys.exit(0) else: sys.stderr.write(f"Unknown mode {mode}\n") sys.exit(1)
if __name__ == '__main__': main()