我正在研究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给我不准确的基准,还是有一些我不理解的魔法?
答案 0 :(得分:5)
请注意timeit
这取决于你的代码,但完全有可能JIT编译器应该归咎于这个令人困惑的结果。每次启动新的pypy进程时都会产生JIT预热开销,但在timeit基准测试期间只会发生一次(因为在同一进程中多次运行_main
)。此外,如果代码的某些部分经常运行,以至于_main
运行一次时不会编译,但只有当它运行时(例如,三次),后续运行也会更快,这进一步消除了最佳结果第一个(即运行pypy problem204.py
一次)。
timeit
结果是正确的,因为它(大致)匹配代码在最佳情况下的速度 - 预热的JIT编译器,很少将CPU丢失到其他程序等。
你的问题是你想要了解不同的东西 - 包括JIT热身的时间。