我正在使用IPython的ipcluster引擎进行简单的蒙特卡罗模拟练习。根据我定义函数的方式,我注意到执行时间的巨大差异,我问的原因是什么。以下是详细信息:
当我确定如下任务时,它很快:
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个循环,最好是每循环1:3.81秒
...这比你慢了71倍。这可能是什么原因?
答案 0 :(得分:1)
我不能太深入,但它更慢的原因是因为sum(<array>)
是内置的CPython求和函数,而你的<numpy array>.sum()
正在使用numpy sum函数,比内置的python版本快得多。
如果您将sum(<array>)
替换为numpy.sum(<array>)
在此处查看numpy sum文档:http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html