Pythonで2乗するには?

べき乗演算子のイメージ Python

Pythonで2乗を計算するには「べき乗演算子(**)」または「pow関数」を使います。

# べき乗演算子を使う場合
print(3 ** 2) # 9

# pow関数を使う場合
print(pow(3, 2)) # 9

「べき乗」とは?

べき乗演算子(**)を使う場合

べき乗演算子とは「**」のようにアスタリスクを2つつなぐ演算子です。

「**」の左側に「底」を右側に「指数」を書くとべき乗を計算できます。

たとえば、3の2乗は次のように計算できます。

answer = 3 ** 2
print(f"3の2乗は{answer}です") # 3の2乗は9です

pow関数を使う場合

pow関数はPythonの組み込み関数です。

特別なライブラリを使わなくてもべき乗を計算できます。

answer = pow(3, 2)
print(f"3の2乗は{answer}です") # 3の2乗は9です

pow関数の第1引数に「底」を、第2引数に「指数」を渡します。

この計算結果は、べき乗演算子を使った場合とまったく同じになります。

べき乗演算子とpow関数の違い

べき乗演算子(**)とpow関数の実行結果はまったく同じです。

Pythonの実装であるCPythonのソースコードを見てみるとpow関数の内部ではべき乗演算子を使った計算が実行されることがわかります。

def pow(a, b):
    "Same as a ** b."
    return a ** b
 
# https://github.com/python/cpython/blob/f4c03484da59049eb62a9bf7777b963e2267d187/Lib/operator.py#L124

両者の違いとしてpow関数では上記のような関数呼び出しが入るため、実行時間が長くなると考えられます。

実際に、以下の条件でべき乗演算子とpow関数をそれぞれ使った場合で実行時間を比較しました。

計測条件

  • Macbook Air 2020 M1
  • メモリ 8GB
  • Python3.11.3
  • インタプリタで実行
  • それぞれ2の10乗を1,000,000回計算し、その実行時間の平均を算出

ソースコード

import timeit

# べき乗演算子を使った場合の実行時間を計測
op_time = timeit.timeit(stmt='2 ** 10', number=1000000)

# pow関数を使った場合の実行時間を計測
pow_time = timeit.timeit(stmt='pow(2, 10)', number=1000000)

# 結果を出力
print(f'べき乗演算子の実行時間: {op_time}')
print(f'pow関数の実行時間: {pow_time}')

計測結果

  • べき乗演算子の実行時間: 0.00815437501296401
  • pow関数の実行時間: 0.06325108394958079

べき乗演算子のほうがはるかに高速であることがわかります。

ただし、べき乗を計算した後に剰余(mod)を計算する場合にかぎっては、pow関数の第3引数を活用すると高速になります。

import timeit

def pow_test_mod():
    pow(2, 1000, 10)

def operator_test_mod():
    (2 ** 1000) % 10

pow_time_mod = timeit.timeit(pow_test_mod, number=1000000)
operator_time_mod = timeit.timeit(operator_test_mod, number=1000000)

print("pow関数の実行時間(mod)", pow_time_mod)
print("べき乗演算子の実行時間(mod):", operator_time_mod)

# pow関数の実行時間(mod) 0.30370674992445856
# べき乗演算子の実行時間(mod): 0.6629589579533786

実際、剰余を計算した場合はpow関数のほうが早くなりました。

まとめると以下のことがいえます。

  • べき乗演算子とpow関数の計算結果は同じ
  • 通常のべき乗計算では、べき乗演算子が高速
  • べき乗を計算した後に剰余を取る場合は、pow関数が高速

タイトルとURLをコピーしました