rap*_*ppr 5 python matlab performance-testing
我读过这个(MATLAB比Python更快吗?),我发现它有很多ifs.
我在仍在Windows XP上运行的旧计算机上尝试过这个小实验.
在MATLAB R2010b中,我在命令窗口中复制并粘贴了以下代码:
tic
x = 0.23;
for i = 1:100000000
x = 4 * x * (1 - x);
end
toc
x
Run Code Online (Sandbox Code Playgroud)
结果是:
Elapsed time is 0.603583 seconds.
x =
0.947347510922557
Run Code Online (Sandbox Code Playgroud)
然后我py用以下脚本保存了一个文件:
import time
t = time.time()
x = 0.23
for i in range(100000000): x = 4 * x * (1 - x)
elapsed = time.time() - t
print(elapsed)
print(x)
Run Code Online (Sandbox Code Playgroud)
我按下F5了,结果是
49.78125
0.9473475109225565
Run Code Online (Sandbox Code Playgroud)
在MATLAB中耗时0.60秒; 在Python中花了49.78秒(永恒!!).
所以问题是:有没有一种简单的方法让Python像MATLAB一样快?
具体来说:如何更改py脚本以使其运行速度与MATLAB一样快?
UPDATE
我尝试了相同的实验PyPy(复制和粘贴上面相同的代码):它在1.0470001697540283秒内在与之前相同的机器上完成.
我用1e9循环重复实验.
MATLAB结果:
Elapsed time is 5.599789 seconds.
1.643573442831396e-004
Run Code Online (Sandbox Code Playgroud)
PyPy 结果:
8.609999895095825
0.00016435734428313955
Run Code Online (Sandbox Code Playgroud)
我也试过一个正常的while循环,结果类似:
t = time.time()
x = 0.23
i = 0
while (i < 1000000000):
x = 4 * x * (1 - x)
i += 1
elapsed = time.time() - t
elapsed
x
Run Code Online (Sandbox Code Playgroud)
结果:
8.218999862670898
0.00016435734428313955
Run Code Online (Sandbox Code Playgroud)
我会尝试NumPy一会儿.
aba*_*ert 11
首先,使用time不是测试这样的代码的好方法.但是,让我们忽略它.
当你的代码执行大量循环并且每次循环都重复非常相似的工作时,PyPy的JIT会做得很好.当代码每次执行完全相同的操作时,对于可以从循环中提取的常量值,它会做得更好.另一方面,CPython必须为每个循环迭代执行多个字节码,因此速度很慢.通过对我的机器的快速测试,CPython 3.4.1需要24.2秒,但PyPy 2.4.0/3.2.5需要0.0059秒.
IronPython和Jython也是JIT编译的(尽管使用更通用的JVM和.NET JIT),因此它们也比CPython更快地进行这种工作.
您通常也可以通过使用NumPy数组和向量操作而不是Python列表和循环来加速CPython本身的工作.例如,以下代码需要0.011秒:
i = np.arange(10000000)
i[:] = 4 * x * (1-x)
Run Code Online (Sandbox Code Playgroud)
当然,在这种情况下,我们只是计算一次值并将其复制10000000次.但是我们可以强制它实际反复计算,它仍然只需要0.12秒:
i = np.zeros((10000000,))
i = 4 * (x+i) * (1-(x+i))
Run Code Online (Sandbox Code Playgroud)
其他选项包括在Cython中编写部分代码(编译为Python的C扩展),并使用Numba,JIT编译CPython中的代码.对于这样的玩具程序,两者都不合适 - 如果您只是尝试优化一次性24秒进程,那么自动生成和编译C代码所花费的时间可能会浪费运行C代码而不是Python代码所节省的时间.但在现实生活中的数值编程中,两者都非常有用.(两者都与NumPy很好地配合.)
并且总会有新项目出现.