Python で指数を行う

Rayven Esplanada 2023年10月10日
  1. Python で指数を行うには ** 演算子を使用する
  2. Python で指数を行うには pow()math.power() を使用する
  3. Python で指数を行うには numpy.np() を用いる
  4. 各ソリューションの実行時間の比較
Python で指数を行う

このチュートリアルでは、Python で指数計算を行う方法を説明します。

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
Rayven Esplanada avatar Rayven Esplanada avatar

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

関連記事 - Python Math