先日試した乱数を使った円周率を求める方法を
numpyを使った方法に置き換えた。
import math
import time
import numpy as np
def calc_pi ( NN ):
arr1 = np.random.rand(NN)
arr2 = np.random.rand(NN)
arr3 = np.sqrt(arr1 * arr1 + arr2 * arr2)
arr3[arr3 > 1] = 0 #1より大きい要素は0に
arr3[arr3 > 0] = 1 #0より大きい要素は1に
in_n = np.sum(arr3) #円内に入ったやつの合計
return ( in_n / NN ) * 4
if __name__ == "__main__":
for j in range (1,9):
NN = 10 ** j
start_time = time.perf_counter()
pi = calc_pi(NN)
execution_time = time.perf_counter() - start_time
delt = math.fabs(math.pi - pi)
print (str(NN).rjust(10)," ",f'{pi:11.010f}'," ",f'{delt:7.06f}'," ",execution_time)
実行結果
試行回数 結果 誤差 処理時間[sec]
10 2.8000000000 0.341593 8.769400028540986e-05
100 3.1200000000 0.021593 4.6955000016168924e-05
1000 3.1960000000 0.054407 5.6955000218295027e-05
10000 3.1420000000 0.000407 0.0003660469997157634
100000 3.1376400000 0.003953 0.0036325510000096983
1000000 3.1415240000 0.000069 0.03182136600025842
10000000 3.1416492000 0.000057 0.2625446400002147
100000000 3.1416174400 0.000025 2.535640128000068
numpy使わずにwhileで計算していたまえの処理に較べて15倍位早い結果。全て配列に収めてから処理するとさすがに早い。ただしメモリもバカ喰い。
