PyPy显示不准确的基准测试结果?(PyPy displaying inaccurate bench

2019-08-02 05:11发布

我工作的项目欧拉 ,并想知道如果我可以使用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几次和输出从来没有,甚至接近基准0.5秒。 不像pypy,python的mtimeit结果与产出相一致。 是pypy给我准确的基准,或者是有一些神奇的,我不明白?

Answer 1:

需要注意的是timeit

  1. (在你的案件10)运行在声明几次,
  2. 这是否数次(3默认情况下),并给出了最低的那个,原因文档中列出 。

这取决于你的代码,但它是完全可能的JIT编译器是造成这种混乱的结果。 使用timeit基准时的JIT预热系统开销每次推出的新pypy处理时间,但只有一次(因为一个运行_main多次在同一个进程)。 此外,如果运行经常,当它不是编译代码的某些部分_main运行一次,但是当它只能运行,也就是说,三次,随后的运行中也将更快,从而进一步消除从第一个最好的结果(即一个用于运行pypy problem204.py一次)。

timeit结果是正确的,因为它(大致)相匹配的代码将如何快速在最好的情况下-暖机的JIT编译器,很少失去了CPU到其他程序,等你的问题是,你想知道的东西不同-包括JIT预热时间。



文章来源: PyPy displaying inaccurate benchmark results?