Python で指数を行う
-
Python で指数を行うには
**演算子を使用する -
Python で指数を行うには
pow()かmath.power()を使用する -
Python で指数を行うには
numpy.np()を用いる - 各ソリューションの実行時間の比較
このチュートリアルでは、Python で指数計算を行う方法を説明します。
数学では、指数計算とは、数値を自分自身と何倍にも掛け合わせる操作のことです。
Python には指数計算を行うための操作や関数が組み込まれています。
Python で指数を行うには ** 演算子を使用する
ほとんどの開発者は、キャレット記号 ^ が数のべき乗を得るための演算子であると考えているようだが、キャレットは数学では指数の記号として使われているからです。しかし、ほとんどのプログラミング言語では、キャレット記号はビット単位の xor 演算子のために予約されています。
Python では、指数演算子は基数と指数数の間にある 2つの連続したアスタリスク ** で象徴されます。
指数演算子の機能は乗算演算子 * の動作を補完するものです; 違いは、指数演算子の 2 番目のオペランドが 1 番目のオペランドの乗算回数を設定することです。
print(5 ** 6)
5 を自力で 6 倍するには、基底演算子 5 と指数演算子 6 の間に演算子 ** を用います。
出力:
15625
この演算子をさまざまなタイプの値でテストしてみましょう。
ここでは、整数、負の整数、ゼロ、そして 1 より小さい値と 1 より大きい値の 2つの float を初期化します。次に、その指数として乱数の整数を代入します。
num1 = 2
num2 = -5
num3 = 0
num4 = 1.025
num5 = 0.5
print(num1, "^12=", num1 ** 12)
print(num2, "^4=", num2 ** 4)
print(num3, "^9999=", num3 ** 9999)
print(num4, "^-3=", num4 ** -3)
print(num5, "^8=", num5 ** 8)
出力:
2^12= 4096
-5^4= 625
0^9999= 0
1.025^-3= 0.928599410919749
0.5^8= 0.00390625
Python で指数を行うには pow() か math.power() を使用する
Python で指数を行うもう一つの方法は、基底と指数を与えられた値を指数化する関数 pow() を使用することです。math モジュールにも同じ目的のための pow() の実装があります。
これらの関数はどちらも 2つの引数を持ち、第 1 引数は基底数、第 2 引数は指数です。
両方の関数を同じ引数で複数回呼び出して出力を比較してみましょう。
import math
print(pow(-8, 7))
print(math.pow(-8, 7))
print(pow(2, 1.5))
print(math.pow(2, 1.5))
print(pow(4, 3))
print(math.pow(4, 3))
print(pow(2.0, 5))
print(math.pow(2.0, 5))
出力:
-2097152
-2097152.0
2.8284271247461903
2.8284271247461903
64
64.0
32.0
32.0
結果の唯一の違いは、math.pow() は整数の引数を渡しても常に float の値を返すのに対し、pow() は少なくとも一つの float 引数がある場合にのみ float の値を返すことです。
Python で指数を行うには numpy.np() を用いる
モジュール NumPy にも指数計算用の関数 power() があります。power() は pow() 関数と同じ引数を受け取り、第 1 引数は基底値、第 2 引数は指数の値です。
NumPy を利用するには、pip または pip3 を経由してインストールする必要があります。
- Python 2:
pip install numpy
- Python 3:
pip3 install numpy
pow() で numpy.power() を使って同じ例を出力してみましょう。
print(np.power(-8, 7))
print(np.power(2, 1.5))
print(np.power(4, 3))
print(np.power(2.0, 5))
出力:
-2097152
2.8284271247461903
64
32.0
power() は組み込みの Python 関数 pow() と同じ出力を生成し、float 引数がなければ整数を返します。
各ソリューションの実行時間の比較
これら 3つの関数と ** 演算子が大きな指数値で実行されるまでの時間を比較してみましょう。タイミング関数については、timeit モジュールをインポートして、それぞれの実行時間を出力します。
基底値は 2、指数の値は 99999 です。
import numpy as np
import math
import time
start = time.process_time()
val = 2 ** 99999
print("** took", time.process_time() - start, "ms")
start = time.process_time()
val = pow(2, 99999)
print("pow() took", time.process_time() - start, "ms")
start = time.process_time()
val = np.power(2, 99999)
print("np.power() took", time.process_time() - start, "ms")
start = time.process_time()
val = math.pow(2, 99999)
print("math.pow() took", time.process_time() - start, "ms")
出力:
** took 0.0006959999999999744 ms
pow() took 0.00039000000000000146 ms
np.power() took 1.6999999999989246e-05 ms
Traceback (most recent call last):
File "/Users/rayven/python/timeit.py", line 15, in <module>
val = math.pow(2,99999)
OverflowError: math range error
最もわかりやすいのは math.pow() の結果が OverflowError であったことです。これは math.pow() が大きな値の指数をサポートできないことを意味します。
他の 3つのメソッドの違いは些細なことですが、この例では np.power() が最も速く指数計算を実行できる関数です。
指数を 9999 に減らしてみるとどうなるでしょうか。math.pow() が何を出力するか見てみましょう。
** took 1.0000000000010001e-05 ms
pow() took 4.000000000004e-06 ms
np.power() took 2.0000000000020002e-05 ms
math.pow() took 2.9999999999752447e-06 ms
Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.
LinkedIn