如何在 Python 中進行冪運算
-
在 Python 中使用
**
運算子來進行冪運算 -
在 Python 中使用
pow()
或math.power()
做指數運算 -
在 Python 中使用
numpy.np()
做指數運算 - 比較每個解決方案的執行時間
本教程將演示如何在 Python 中進行冪運算/指數計算。
在數學中,冪運算/指數運算是一個數字與自身相乘的操作。
Python 提供了內建的操作和函式來幫助執行冪運算。
在 Python 中使用**
運算子來進行冪運算
大多數開發人員似乎認為插入符號^
是獲取數字冪的運算子,因為插入符號在數學中被用作指數的符號。然而,在大多數程式語言中,插入符號被保留給按位 xor
運算子。
在 Python 中,指數運算子由基數和指數之間的兩個連續的星號**
來表示。
指數運算子的功能補充了乘法運算子*
的行為,不同的是指數運算子中的第二個運算元是用來設定第一個運算元與自己相乘的次數。
print(5**6)
要將數字 5
與自身相乘 6
倍,請在基本運算元 5
和指數運算元 6
之間使用運算元**
。
輸出:
15625
讓我們在不同型別的數值上測試這個運算子。
我們將初始化一個整數、一個負數、零和兩個小於 1
和大於 1
的浮點數。然後我們將分配隨機整數作為它們的指數。
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 個引數,第一個引數是基數,第二個是指數。
讓我們嘗試用相同的引數多次呼叫這兩個函式,以便比較它們的輸出。
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()
函式相同的引數,其中第一個引數是基礎值,第二個引數是指數值。
要使用 NumPy
,我們應該通過 pip
或 pip3
安裝它。
- Python 2:
pip install numpy
- Python 3:
pip3 install numpy
讓我們用 numpy.power()
在 pow()
中列印出同一組例子。
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