2

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 倍遅いです。この理由は何ですか?

4

1 に答える 1

1

あまり詳しく説明することはできませんが、遅い理由sum(<array>)は、組み込みの CPython sum 関数が原因であるのに対し<numpy array>.sum()、組み込みの Python バージョンよりも大幅に高速な numpy sum 関数を使用しているためです。

に置き換えるsum(<array>)と、同様の結果が得られると思いますnumpy.sum(<array>)

ここで numpy sum ドキュメントを参照してください: http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html

于 2013-08-29T20:59:00.823 に答える