PyPy显示不准确的基准测试结果?

时间:2012-11-01 15:53:23

标签: python benchmarking pypy

我正在研究Project Euler并想知道我是否可以使用PyPy来加速我的解决方案。但是,我发现结果非常令人失望,因为它需要更多时间来计算。

d:\projeuler>pypy problem204.py
3462.08630405 mseconds

d:\projeuler>python problem204.py
1823.91602542 mseconds

由于mseconds输出是使用python的time模块计算的,所以我使用内置的基准测试命令再次运行它。

d:\projeuler>pypy -mtimeit -s "import problem204" "problem204._main()"
10 loops, best of 3: 465 msec per loop

d:\projeuler>python -mtimeit -s "import problem204" "problem204._main()"
10 loops, best of 3: 1.87 sec per loop

PyPy报告称完成运行需要大约半秒钟。但是,我尝试了多次运行pypy problem204,输出甚至从未接近基准测试.5秒。与pypy不同,python的mtimeit结果与输出一致。是pypy给我不准确的基准,还是有一些我不理解的魔法?

1 个答案:

答案 0 :(得分:5)

请注意timeit

  1. 多次运行语句(在您的情况下为10),
  2. 这样做了几次(默认为3次)并且给出了最小值,原因为outlined in the documentation
  3. 这取决于你的代码,但完全有可能JIT编译器应该归咎于这个令人困惑的结果。每次启动新的pypy进程时都会产生JIT预热开销,但在timeit基准测试期间只会发生一次(因为在同一进程中多次运行_main)。此外,如果代码的某些部分经常运行,以至于_main运行一次时不会编译,但只有当它运行时(例如,三次),后续运行也会更快,这进一步消除了最佳结果第一个(即运行pypy problem204.py一次)。

    timeit结果是正确的,因为它(大致)匹配代码在最佳情况下的速度 - 预热的JIT编译器,很少将CPU丢失到其他程序等。 你的问题是你想要了解不同的东西 - 包括JIT热身的时间。