先日試した乱数を使った円周率を求める方法を
numpyを使った方法に置き換えた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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) |
実行結果
1 2 3 4 5 6 7 8 9 10 |
試行回数 結果 誤差 処理時間[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倍位早い結果。全て配列に収めてから処理するとさすがに早い。ただしメモリもバカ喰い。