python x。** y与math.pow(x,y)的指数

python x。** y与math.pow(x,y)的指数,第1张

python x。** y与math.pow(x,y)的指数

使用Power运算符

**
将更快,因为它不会产生函数调用的开销。如果您反汇编Python代码,则可以看到以下内容:

>>> dis.dis('7. ** i')  10 LOAD_ConST    0 (7.0)    3 LOAD_NAME     0 (i)    6 BINARY_POWER 7 RETURN_VALUE         >>> dis.dis('pow(7., i)')  10 LOAD_NAME     0 (pow)    3 LOAD_ConST    0 (7.0)    6 LOAD_NAME     1 (i)    9 CALL_FUNCTION 2 (2 positional, 0 keyword pair)   12 RETURN_VALUE         >>> dis.dis('math.pow(7, i)')  10 LOAD_NAME     0 (math)    3 LOAD_ATTR     1 (pow)    6 LOAD_ConST    0 (7)    9 LOAD_NAME     2 (i)   12 CALL_FUNCTION 2 (2 positional, 0 keyword pair)   15 RETURN_VALUE

请注意,我在这里使用变量

i
作为指数,因为类似常数的表达式
7. ** 5
实际上是在编译时求值的。

现在,实际上,这种差异并不重要,正如您在计时时可以看到的那样:

>>> from timeit import timeit>>> timeit('7. ** i', setup='i = 5')0.2894785532627111>>> timeit('pow(7., i)', setup='i = 5')0.41218495570683444>>> timeit('math.pow(7, i)', setup='import math; i = 5')0.5655053168791255

所以,虽然

pow
math.pow
大约慢一倍,但仍不够快,不会太在乎。除非您实际上可以将求幂识别为瓶颈,否则如果清晰度降低,就没有理由选择一种方法而不是另一种方法。这尤其适用,因为
pow
例如提供了集成的模运算。


Alfe在上述评论中提出了一个很好的问题:

timeit
表明这
math.pow
**
所有情况都要慢。
math.pow()
无论如何有什么好处?有谁知道它有什么好处呢?

math.pow
内置函数
pow
和幂运算符的最大区别
**
在于,它 始终
使用浮点语义。因此,如果由于某种原因而要确保返回的结果是浮点数,
math.pow
则将确保此属性。

我们来看一个示例:我们有两个数字

i
j
,不知道它们是浮点数还是整数。但我们希望得到的浮点结果
i^j
。那么我们有什么选择呢?

  • 我们可以将至少一个参数转换为浮点数,然后执行
    i ** j
  • 我们可以
    i ** j
    将结果转换为浮点数(当浮点数为
    i
    或时,会自动使用浮点指数
    j
    ,因此结果相同)。
  • 我们可以使用
    math.pow

因此,让我们测试一下:

>>> timeit('float(i) ** j', setup='i, j = 7, 5')0.7610865891750791>>> timeit('i ** float(j)', setup='i, j = 7, 5')0.7930400942188385>>> timeit('float(i ** j)', setup='i, j = 7, 5')0.8946636625872202>>> timeit('math.pow(i, j)', setup='import math; i, j = 7, 5')0.5699394063529439

如您所见,

math.pow
实际上更快!如果考虑一下,函数调用的开销现在也消失了,因为在所有其他替代方案中,我们都必须调用
float()


此外,可能值得指出的是

**
pow
可以通过实现自定义类型的特殊
__pow__
(和
__rpow__
)方法来覆盖和的行为。因此,如果您出于某种原因(无论出于何种原因)不希望使用它,
math.pow
则不会这样做。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5623437.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存