使用math.pow或**运算符哪个更有效?我什么时候应该使用另一个?
到目前为止,我知道x**y
可以返回一个int
或一个,float
如果您使用小数,该函数pow
将返回一个浮点数
import math
print math.pow(10, 2)
print 10. ** 2
使用Power运算符**
将更快,因为它不会产生函数调用的开销。如果您反汇编Python代码,则可以看到以下内容:
>>> dis.dis('7. ** i')
1 0 LOAD_CONST 0 (7.0)
3 LOAD_NAME 0 (i)
6 BINARY_POWER
7 RETURN_VALUE
>>> dis.dis('pow(7., i)')
1 0 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)')
1 0 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
则不会这样做。
此方法将基数返回到指数幂,即基于幂指数。 语法 (Syntax) Math.pow(x, y) 参数 (Parameter) x - 代表基数 y - 代表指数 返回值 (Return Value) 返回指数幂的基数。 例子 (Example) console.log("---Math.pow()---") console.log("math.pow(2,3) : "+Math.pow(2,
问题内容: 我正在编写一个Java程序来计算将“我的唱歌的怪兽”中的怪兽达到一定水平所需要的食物。当我运行程序时,它说:“无法从double转换为int”。有人可以解释为什么吗?这是程序。 问题答案: 您必须这样做: 如您在文档中所看到的,它会按设计返回a ,但是如果需要,则必须执行显式强制转换。
将返回来自x(包括)和y(不包括)的流。将返回来自x(含)和y(含)的流。 我期望调用或调用。但是当查看的源代码时,它是这样的: 也有一个非常相似的实现,而不是。唯一的区别是的第三个参数是而不是表示范围已关闭。 然后使用此布尔值初始化类中的字段,并针对它提到以下注释: 如果该范围已关闭且最后一个元素未被遍历,则为1,如果该范围已打开,或该范围已关闭且所有元素都已被遍历,则为0 为什么需要这样的实现
问题内容: 考虑以下示例: 我不确定Java语言规范中是否有一项规定要加载变量的先前值以便与右侧()进行比较,该变量应按照方括号内的顺序进行计算。 为什么第一个表达式求值,而第二个表达式求值?我本来希望先被评估,然后再与自身()比较并返回。 这个问题与Java表达式中子表达式的求值顺序不同,因为这里绝对不是“子表达式”。需要 加载 它以进行比较,而不是对其进行“评估”。这个问题是特定于Java的,
描述 (Description) 逻辑运算符[X|Y]匹配X或Y. 例子 (Example) 以下示例显示了逻辑运算符的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class LogicalOperatorDemo { private sta
问题内容: 几年前我有这个面试问题,但是我还没有找到答案。 做无限循环的x和y应该是什么? 我们试着用,, VS 。 问题答案: 您需要两个可比较,具有相同值但代表不同实例的变量,例如: 和都为true,因为取消了装箱,但是实例相等性为false。 请注意,它也可以与一起使用,并且任何值(不仅是0)都可以使用。 您还可以使用JVM的复杂性-它们通常仅缓存最多127个整数,因此也可以使用: (但是1