psf / pyperf

Toolkit to run Python benchmarks
http://pyperf.readthedocs.io/
MIT License
771 stars 74 forks source link

Pyperf API examples fail when running from a REPL #145

Closed ngoldbaum closed 1 year ago

ngoldbaum commented 1 year ago

When I try to run an example from the docs inside IPython or a regular python REPL, it fails with the following output:

$ ipython
Python 3.10.5 (main, Jul  4 2022, 10:24:08) [GCC 11.2.0]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import pyperf
   ...: import time
   ...: 
   ...: 
   ...: def func():
   ...:     time.sleep(0.001)
   ...: 
   ...: 
   ...: runner = pyperf.Runner()
   ...: runner.bench_func('sleep', func)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'worker' is not defined
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Input In [1], in <cell line: 10>()
      6     time.sleep(0.001)
      9 runner = pyperf.Runner()
---> 10 runner.bench_func('sleep', func)

File ~/.pyenv/versions/3.10.5/lib/python3.10/site-packages/pyperf/_runner.py:537, in Runner.bench_func(self, name, func, *args, **kwargs)
    535 task = WorkerProcessTask(self, name, task_func, metadata)
    536 task.inner_loops = inner_loops
--> 537 result = self._main(task)
    539 if self.args.profile:
    540     merge_profile_stats(profiler, self.args.profile)

File ~/.pyenv/versions/3.10.5/lib/python3.10/site-packages/pyperf/_runner.py:460, in Runner._main(self, task)
    458         bench = None
    459     else:
--> 460         bench = self._manager()
    461 except KeyboardInterrupt:
    462     what = "Benchmark worker" if args.worker else "Benchmark"

File ~/.pyenv/versions/3.10.5/lib/python3.10/site-packages/pyperf/_runner.py:668, in Runner._manager(self)
    666 if self.args.verbose and self._worker_task > 0:
    667     print()
--> 668 bench = Manager(self).create_bench()
    669 if not self.args.quiet:
    670     print()

File ~/.pyenv/versions/3.10.5/lib/python3.10/site-packages/pyperf/_manager.py:232, in Manager.create_bench(self)
    229     self.args.warmups = 1
    231 while self.nprocess < self.need_nprocess:
--> 232     worker_bench, run = self.create_worker_bench()
    233     self.display_run(worker_bench, run)
    234     self.handle_calibration(run)

File ~/.pyenv/versions/3.10.5/lib/python3.10/site-packages/pyperf/_manager.py:131, in Manager.create_worker_bench(self)
    130 def create_worker_bench(self):
--> 131     suite = self.create_suite()
    133     # get the run
    134     benchmarks = suite._benchmarks

File ~/.pyenv/versions/3.10.5/lib/python3.10/site-packages/pyperf/_manager.py:121, in Manager.create_suite(self)
    119 # compute the run
    120 if self.next_run == 'loops':
--> 121     suite = self.spawn_worker(self.calibrate_loops, 0)
    122 elif self.next_run == 'warmups':
    123     suite = self.spawn_worker(0, self.calibrate_warmups)

File ~/.pyenv/versions/3.10.5/lib/python3.10/site-packages/pyperf/_manager.py:107, in Manager.spawn_worker(self, calibrate_loops, calibrate_warmups)
    104         exitcode = proc.wait()
    106 if exitcode:
--> 107     raise RuntimeError("%s failed with exit code %s"
    108                        % (cmd[0], exitcode))
    110 return _load_suite_from_pipe(bench_json)

RuntimeError: /home/nathan/.pyenv/versions/3.10.5/bin/python3 failed with exit code 1
ngoldbaum commented 1 year ago

It runs fine inside of a script though.

ngoldbaum commented 1 year ago

oops, this is a repost of #74