如何在 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