我使用 PyPy 错了吗?它比标准 Python 慢 10 倍
Am I using PyPy wrong? It's slower 10x than standard Python
我听说过有关 PyPy 的好消息。特别是我听说它非常快,这让我想知道它是否可用于我拥有的嵌入式项目。
我为我的 Windows 7
PC 下载了 PyPy-2.6
,并将内容解压缩到一个目录中。
我编写了一个小测试程序来进行基准测试:
import time
def fib(n):
if n == 0 or n == 1:
return 1
return fib(n - 1) + fib(n - 2)
t0 = time.time()
fib(20)
t1 = time.time()
print t1-t0
所以我去了PyPy解压的目录,运行 ./pypy.exe hello.py
得到了0.120
的答案。
然后我启动了一个 cygwin 控制台和 运行 python hello.py
并得到了 0.01
的答案。
我是不是用错了 PyPy 或者它只是对某些应用程序更快?
编辑
感谢 Rob 指出 JIT 编译器需要时间预热。
扩展我的示例代码会产生以下结果:
n PyPy Python
20 0.12 0.01
25 0.15 0.06
30 0.34 0.67
35 0.92 7.39
40 10.98 82.9
好像有0.1秒的启动成本什么的,但是之后就快了。
它只对某些应用程序更快。引用 PyPy doc:
There are two cases that you should be aware where PyPy will not be able to speed up your code:
Short-running processes: if it doesn't run for at least a few seconds, then the JIT compiler won't have enough time to warm up.
If all the time is spent in run-time libraries (i.e. in C functions), and not actually running Python code, the JIT compiler will not help.
由于您的程序似乎 运行 大约为 10-2 或 10-1 秒,JIT 编译器对你没有任何好处。
我听说过有关 PyPy 的好消息。特别是我听说它非常快,这让我想知道它是否可用于我拥有的嵌入式项目。
我为我的 Windows 7
PC 下载了 PyPy-2.6
,并将内容解压缩到一个目录中。
我编写了一个小测试程序来进行基准测试:
import time
def fib(n):
if n == 0 or n == 1:
return 1
return fib(n - 1) + fib(n - 2)
t0 = time.time()
fib(20)
t1 = time.time()
print t1-t0
所以我去了PyPy解压的目录,运行 ./pypy.exe hello.py
得到了0.120
的答案。
然后我启动了一个 cygwin 控制台和 运行 python hello.py
并得到了 0.01
的答案。
我是不是用错了 PyPy 或者它只是对某些应用程序更快?
编辑
感谢 Rob 指出 JIT 编译器需要时间预热。
扩展我的示例代码会产生以下结果:
n PyPy Python 20 0.12 0.01 25 0.15 0.06 30 0.34 0.67 35 0.92 7.39 40 10.98 82.9
好像有0.1秒的启动成本什么的,但是之后就快了。
它只对某些应用程序更快。引用 PyPy doc:
There are two cases that you should be aware where PyPy will not be able to speed up your code:
Short-running processes: if it doesn't run for at least a few seconds, then the JIT compiler won't have enough time to warm up.
If all the time is spent in run-time libraries (i.e. in C functions), and not actually running Python code, the JIT compiler will not help.
由于您的程序似乎 运行 大约为 10-2 或 10-1 秒,JIT 编译器对你没有任何好处。