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