YAS's VB.NET Tips
 
Pythonista活用
Pythonista活用 >> 記事詳細

2019/01/18

速い平方根の求め方

Tweet ThisSend to Facebook | by:YAS
 Pythonで実数n(n≧0)の平方根を求めるには,n**(1/2),math.sqrt(n),numpy.sqrt(n),pow(n,1/2)などがある。答えの有効桁数や,nを負数にした場合の挙動などに違いが見られるが,基本的には同じ答えが得られる。
import time
import math
import numpy as np

for n in range(10):
  
print(n+1,'回戦')
  t1
=time.time()
  
for i in range(1000000):
    p
=i**(1/2)
  t2
=time.time()
  
print(t2-t1)

  t1
=time.time()
  
for i in range(1000000):
    p
=math.sqrt(i)
  t2
=time.time()
  
print(t2-t1)

  t1
=time.time()
  
for i in range(1000000):
    p
=pow(i,1/2)
  t2
=time.time()
  
print(t2-t1)

  t1
=time.time()
  
for i in range(1000000):
    p
=np.sqrt(i)
  t2
=time.time()
  
print(t2-t1)

 上のコードをPythonista3とJupyter Notebookで実行したところ,n**(1/2)math.sqrt(n)がほぼ同じで速く,pow(n,1/2)が少し遅く,numpy.sqrt(n)がかなり遅いという結果になりました。(numpy.sqrt()は配列やリストなど複数の数をまとめて処理させると速いそうです。)
 Pythonista3(iPad 2017モデル) Jupyter Notebook
1 回戦
0.25328826904296875  ← n**(1/2)
0.2289888858795166   ← math.sqrt(n)
0.3298521041870117   ← pow(n,1/2)
5.7376227378845215   ← numpy.sqrt(n)
2 回戦
0.2213280200958252
0.22719120979309082
0.3298790454864502
5.751811981201172
3 回戦
0.22010588645935059
0.2246711254119873
0.3332500457763672
5.7477171421051025
4 回戦
0.2227330207824707
0.22210407257080078
0.3330090045928955
5.739731788635254
5 回戦
0.22470712661743164
0.2236800193786621
0.33375072479248047
5.742916107177734
6 回戦
0.22667884826660156
0.2206406593322754
0.33280515670776367
5.731882095336914
7 回戦
0.22341084480285645
0.2242288589477539
0.33399105072021484
5.738736867904663
8 回戦
0.22586584091186523
0.22838401794433594
0.3287699222564697
5.748663902282715
9 回戦
0.21982312202453613
0.22762703895568848
0.330125093460083
5.741748094558716
10 回戦
0.2216320037841797
0.2248692512512207
0.3309180736541748
5.735345840454102
 1 回戦
0.30855536460876465
0.38390588760375977
0.6192374229431152
1.7245447635650635
2 回戦
0.28778696060180664
0.243882417678833
0.48995542526245117
1.57002854347229
3 回戦
0.2936825752258301
0.31377220153808594
0.49370288848876953
1.7043194770812988
4 回戦
0.33944153785705566
0.3863201141357422
0.5154023170471191
1.5431039333343506
5 回戦
0.42851996421813965
0.2959136962890625
0.49349379539489746
1.9792490005493164
6 回戦
0.36693477630615234
0.24079442024230957
0.7523927688598633
2.1007657051086426
7 回戦
0.39217042922973633
0.3354625701904297
0.5430314540863037
1.8233575820922852
8 回戦
0.3186681270599365
0.29424381256103516
0.5318617820739746
1.803809642791748
9 回戦
0.28631591796875
0.24852752685546875
0.4139130115509033
1.4854552745819092
10 回戦
0.44863057136535645
0.24718928337097168
0.4330742359161377
1.3051936626434326

23:58 | 投票する | 投票数(0) | コメント(0)