2013-08-29 17 views
2

我正在使用IPython的IPcluster引擎进行简单的蒙特卡罗模拟练习。基于我如何定义函数,我注意到执行时间的巨大差异,我正在问这个原因。下面是详细信息:基于IPython上的sum()的执行时间差异

当我definde任务如下,它是快速:

def sample(n): 
    return (rand(n)**2 + rand(n)**2 <= 1).sum() 

当并行运行:

from IPython.parallel import Client 
rc = Client() 
v = rc[:] 
with v.sync_imports(): 
from numpy.random import rand 
n = 1000000 

timeit -r 1 -n 1 print 4.* sum(v.map_sync(sample, [n]*len(v)))/(n*len(v)) 

3.141712 
1 loops, best of 1: 53.4 ms per loop 

但是,如果我改变的功能:

def sample(n): 
    return sum(rand(n)**2 + rand(n)**2 <= 1) 

我得到:
3.141232 1 l哎呀,最好的1:3.81秒每回路

...这是71时间慢。这可能是什么原因?

回答

1

我不能太深入,但其原因是因为sum(<array>)是内置的CPython求和函数,而你的<numpy array>.sum()使用的是numpy求和函数,它比内置函数快得多,在python版本。

我想,如果你有numpy.sum(<array>)更换sum(<array>)你会得到类似的结果

看到numpy的总和文档浏览:http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html

+0

感谢@Cameron SPARR –