1. 概要
MD(分子動力学)の記事を書いているときにふと気になったので調べました。
以下の5通りで戦います。
a * a * a * ・・・
a_2 = a * a, a_4 = a_2 * a_2 ・・・
a ** b
pow(a, b)
np.power(a, b)
2. 条件
- 1回のループ内で定数aを10乗させる処理を行います。
- ループ回数は100万回です。計測には
time
モジュールを使います。 - 各条件の処理は以下の通りです。
for _ in range(num_loop):
x = a * a * a * a * a * a * a * a * a * a
for _ in range(num_loop):
x_2 = a * a
x_4 = x_2 * x_2
x_10 = x_4 * x_4 * x_2
for _ in range(num_loop):
x = a ** 10
for _ in range(num_loop):
x = pow(a, 10)
for _ in range(num_loop):
x = np.power(a, 10)
3. 結果
3-1. a = 1
a * a * a * ・・・ : 0.1461648941040039
a_2 = a * a ・・・ : 0.08412599563598633 優勝!
a ** b : 0.24338006973266602
pow(a, b) : 0.26867198944091797
np.power(a, b) : 0.9174587726593018
3-2. a = 1e10
a * a * a * ・・・ : 0.14845013618469238
a_2 = a * a ・・・ : 0.0875389575958252
a ** b : 0.07700586318969727 優勝!
pow(a, b) : 0.10171699523925781
np.power(a, b) : 1.22843599319458
3-3. a = 1e-10
a * a * a * ・・・ : 0.14542508125305176
a_2 = a * a ・・・ : 0.08142709732055664
a ** b : 0.06892800331115723 優勝!
pow(a, b) : 0.10165691375732422
np.power(a, b) : 1.2617030143737793
4. 考察
pythonの内部処理がどうなっているかさっぱりなので検証方法もざっくりです。
有識者の方は是非コメントいただけると嬉しいです
私は脳死で**
を使おうと思います。