2024.6.21 powの計算速度比較【math, numpy】
以下3通りの2乗の計算に要する時間を比較する。
オペランド「**」
math.pow
numpy.pow
code:pow1.py
import math
import numpy as np
import time
loopmax = 100000000
x = 3.14
#
time1_init = time.process_time()
for i in range(loopmax):
y = x**2
time1 = time.process_time() - time1_init
print('operand** :', time1)
#
time2_init = time.process_time()
for i in range(loopmax):
y = math.pow(x, 2)
time2 = time.process_time() - time2_init
print('math.pow :', time2)
#
time3_init = time.process_time()
for i in range(loopmax):
y = np.pow(x, 2)
time3 = time.process_time() - time3_init
print('numpy.pow :', time3)
table:4回施行した結果
試行 operand math numpy
1回目 5.6356 6.2908 50.895
2回目 5.3970 5.9916 55.279
3回目 4.6961 6.3501 54.252
まとめると
オペランド「**」とmath.powはそこまで差が無い
numpy.powは他と比較すると9倍程度低速である
numpy.powは、受け取ったスカラ値をnumpy型のデータに変換したうえで処理を行っていると推測する。呼び出す時点でその型に変換した値を渡すよう修正する。
code:pow2.py
import math
import numpy as np
import time
loopmax = 100000000
x = np.float64(3.14) # (A)
#
time1_init = time.process_time()
for i in range(loopmax):
y = x**2
time1 = time.process_time() - time1_init
print('operand** :', time1)
#
time2_init = time.process_time()
for i in range(loopmax):
y = math.pow(x, 2)
time2 = time.process_time() - time2_init
print('math.pow :', time2)
#
time3_init = time.process_time()
for i in range(loopmax):
y = np.pow(x, 2)
time3 = time.process_time() - time3_init
print('numpy.pow :', time3)
(A) の時点でnp.float64型に変換した。結果は、
回数 operand math numpy
1回目 5.4417 6.5488 47.3252
2回目 5.6408 6.9470 46.2744
3回目 5.2354 7.1223 47.1629
オペランドに対してmathは1.2倍程度の時間を要する
numpyは先の実験に対して80%程度の所要時間に短縮されたように伺える