2013-06-21 64 views
5

我在同一台机器上运行的Python 2.7和MATLAB R2010a版本,什么都不做要慢10倍,它给我的速度在蟒蛇环比MATLAB

我在网上看了10倍不同,听到它应该是相同的订购。 Python会进一步下降放缓,if语句和数学运算符在for循环

我的问题:这是现实?或者有其他方式让他们在相同的速度顺序?


这里是Python代码

import time 

start_time = time.time() 

for r in xrange(1000): 

     for c in xrange(1000): 

     continue 

elapsed_time = time.time() - start_time 

print 'time cost = ',elapsed_time 

Output: time cost = 0.0377440452576

这里是MATLAB代码

tic 

for i = 1:1000 

    for j = 1:1000 

    end 

end 

toc 

Output: Escaped time is 0.004200 seconds

+0

如果存在与编译器优化器有什么不同,但是您是否尝试通过而不是继续?也许如果你添加一个非常基本的计算,'t = t + 1',那么它会改变。 – slbass

+0

使用'python -m timeit'测试循环显示使用'pass'比'continue'慢一点,但不是很重要。在我的机器上,环路需要16毫秒,这比OP声称的要少一半。还要注意,MATLAB有一个[JIT],因此这种差异是可以预期的*尤其是*简单循环。 – Bakuriu

+3

可能值得在循环内部放置一些东西,以防万一Matlab能够足够聪明地认识到循环实际上没有做任何事情,并且优化了它们。 – Aya

回答

2

如果Python的EXECUT离子的性能是真的对你重要,你可能会在PyPy

看看我做了测试:

import time 
for a in range(10): 
    start_time = time.time() 
    for r in xrange(1000): 
     for c in xrange(1000): 
      continue 

    elapsed_time = time.time()-start_time 
    print elapsed_time 

与标准Python 2.7.3,我得到:

0.0311839580536 
0.0310959815979 
0.0309510231018 
0.0306520462036 
0.0302460193634 
0.0324130058289 
0.0308878421783 
0.0307397842407 
0.0304911136627 
0.0307500362396 

然而,使用PyPy 1.9.0(对应于Python 2.7.2),我得到:

0.00921821594238 
0.0115230083466 
0.00851202011108 
0.00808095932007 
0.00496387481689 
0.00499391555786 
0.00508499145508 
0.00618195533752 
0.005126953125 
0.00482988357544 

加速度o ˚FPyPy是非常惊人的,当它的JIT编译器优化超过其成本确实变得可见。这也是为什么我介绍额外的循环。对于这个例子,绝对不需要修改代码。

+3

PyPy的问题是它仍然不支持NumPy,所以它不是一个理想的MATLAB替代品。 –

8

出现这种情况的原因涉及到JIT编译器,这是优化MATLAB for循环。您可以禁用/启用使用feature accel offfeature accel on的JIT加速器。当你禁用加速器时,时间会发生巨大变化。

MATLAB与加速度:Elapsed time is 0.009407 seconds.

MATLAB与加速度关闭:Elapsed time is 0.287955 seconds.

蟒蛇:time cost = 0.0511920452118

因此,JIT加速直接导致你都注意到了加速。还有一件事,你应该考虑,这是关系到你所定义的迭代指数的方式。在这两种情况下,MATLAB和Python中,您使用迭代器来定义您的循环。在MATLAB中,通过添加方括号([])来创建实际值,而在Python中,您使用range而不是xrange。当你做出这些改变

% MATLAB 
for i = [1:1000] 
    for j = [1:1000] 

# python 
for r in range(1000): 
    for c in range(1000): 

时代成为

MATLAB与加速度:Elapsed time is 0.338701 seconds.

MATLAB与加速度关闭:Elapsed time is 0.289220 seconds.

蟒蛇:time cost = 0.0606048107147

最后一个考虑因素是如果你要为循环添加一个快速计算。即t=t+1。然后时间变得

MATLAB与加速度:Elapsed time is 1.340830 seconds.

MATLAB与加速度关闭:Elapsed time is 0.905956 seconds.(是关是更快)

蟒蛇:time cost = 0.147221088409

我认为这里的道德是,根据具体情况,for循环的开箱即用的计算速度相当于极其简单的循环。然而,python中还有其他一些数值工具可以显着加快速度,numpy和PyPy已经被提出。

+0

Python的'xrange'是一个简单的迭代器。如果你想比较MATLAB版本和Python版本,你应该使用普通的'range'。 – Bakuriu

+0

@Bakuriu你是对的,我改变了我的帖子使用范围和更新运行时,虽然没有真正改变。 – slbass

+0

如果你比较相同的代码块,但使用Matlab的'for i = 1:1000'与Python 2.x的'xrange',你会得到什么结果? – Aya

3

基本的Python实现CPython并不意味着超速。如果您需要高效的matlab风格的数值处理,请使用the numpy package或专为快速工作而设计的Python实现,例如PyPy或Cython。 (在C中编写一个Python扩展,当然速度很快,也是一个可行的解决方案,但是在这种情况下,你可能只需要使用numpy并且省下不少努力。)