执行时间差异基于IPython上的sum()

时间:2013-08-29 20:50:22

标签: python ipython ipython-parallel

我正在使用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倍。这可能是什么原因?

1 个答案:

答案 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