当前位置: 首页 > 面试题库 >

Python中的幂运算-我应该更喜欢**运算符,而不是math.pow和math.sqrt吗?[重复]

范福
2023-03-14
问题内容

这个问题已经在这里有了答案

在Python中哪个更快:x **。5或math.sqrt(x)? (14个回答)

7年前关闭。

在我的领域中,对一些数字求平方,将它们运算在一起并取结果的平方根是很常见的。例如,以毕达哥拉斯定理和RMS计算完成。

在numpy中,我已执行以下操作:

result = numpy.sqrt(numpy.sum(numpy.pow(some_vector, 2)))

在纯python中,应该会这样:

result = math.sqrt(math.pow(A, 2) + math.pow(B,2)) # example with two dimensions.

但是,我一直在使用这种纯python形式,因为我发现它更加紧凑,独立于导入并且看似等效:

result = (A**2 + B**2)**0.5   # two dimensions
result = (A**2 + B**2 + C**2 + D**2)**0.5

我听过有人争论说,**运算符有点像黑客,通过乘幂来对数字求平方0.5并不那么容易理解。但是我想问的是:

“有没有计算上的理由要比第三种更喜欢前两种选择?”

谢谢阅读!


问题答案:

math.sqrt是平方根的C实现,因此与使用**实现Python内置pow函数的运算符不同。因此,使用math.sqrt实际给出的答案与使用**运算符给出的答案不同,并且确实有一个计算上的原因比内置函数更偏向于numpy或采用math模块实现。特别是,sqrt函数可能以最有效的方式实现,而**在大量的基数和指数上运行,并且对于平方根的特定情况可能未进行优化。另一方面,内置pow函数可以处理一些额外的情况,例如“复数,无穷整数幂和模幂”。

有关**和之间的区别的更多信息,请参见此堆栈溢出问题math.sqrt

关于哪个更“
Pythonic”,我认为我们需要讨论该词的确切定义。从官方Python词汇表中可以看出,如果某段代码或构想“紧紧遵循Python语言最常见的习惯用法,而不是使用其他语言的通用概念来实现代码”,则该代码或构想就是Pythonic。在我能想到的每种其他语言中,都有一些具有基本平方根函数的数学模块。但是,有些语言缺少像**C
++这样的幂运算符。所以,**可能是更Python,但它是否是客观的更好取决于所使用的情况。



 类似资料:
  • 问题内容: 我没有在Swift语言参考的基本算术运算符中看到定义的幂运算符。 语言中真的没有预定义的整数或浮点运算符吗? 问题答案: 没有操作员,但是您可以使用pow函数,如下所示: 如果愿意,还可以让操作员像这样调用pow函数:

  • 问题内容: 有人告诉我,InnoDB比MyISAM好得多。因此,当我创建表时,是否应该 始终 尝试使用InnoDB Engine而不是MyISAM?还是两者都有很大的好处? 问题答案: 是无事务的并且是堆组织的。记录由表中的行偏移量标识,索引将此偏移量存储为行指针。 支持交易并按索引组织。记录由的值标识(或未定义隐藏的内部列),并存储在中。二级索引将的值存储为行指针。 涉及全表扫描或二级索引查找的

  • 本文向大家介绍Python中比较特别的除法运算和幂运算介绍,包括了Python中比较特别的除法运算和幂运算介绍的使用技巧和注意事项,需要的朋友参考一下 不管是啥语言都离不开加减乘除这些算法,但是在Python里面你知道这些符号代表什么运算吗? “/”这个是除法运算,那么这个“//”呢?“*”这个是乘法运算,那么这个“**”呢?下面来一一介绍下。 “//”运算 除法运算符是“/”,这个人人皆知道,但

  • 问题内容: 是否可以在Python中重载运算符?如果是这样,可以定义新的运算符,例如和吗? 问题答案: 正如其他答案所提到的,您确实可以重载运算符(通过在正在编写的类中定义特殊方法,即名称以两个下划线开头和结尾的方法)。所有的细节都在这里。 要完成对您问题的回答:您不能定义新的运算符;但是它不是一个新的运算符,它是一个现有的运算符,并且通过在类中定义method来使其过载。 作为历史记录,这在C

  • 问题内容: 此方法搜索第一组单词字符(即),返回第一个匹配的组或出现故障的情况。 相同的函数可以重写为: 这是相同的,并且已记录为行为。作为此页中明确指出: 表达式首先计算; 如果为假,则返回其值;否则,将求值并返回结果值。 但是,作为布尔运算符(甚至在手册中也是如此),我希望返回一个布尔值。结果,当我发现这是如何工作时,我感到非常惊讶。 有什么其他用例,和/或这种不太直观的实现的原理是什么? 问

  • 前面章节介绍了 Python 中的各个序列类型,每个类型都有其独特的操作方法,例如列表类型支持直接做加法操作实现添加元素的功能,字符串类型支持直接做加法实现字符串的拼接功能,也就是说,同样的运算符对于不同序列类型的意义是不一样的,这是怎么做到的呢? 其实在 Python 内部,每种序列类型都是 Python 的一个类,例如列表是 list 类,字典是 dict 类等,这些序列类的内部使用了一个叫作

  • 问题内容: 什么是运营商吗?例如,以下操作做什么? 问题答案: 它是右移操作符,将所有位向右“移动”一次。 二进制10是 1010 移到右边变成 0101 这是5

  • 问题内容: 我最近了解了python中的运算符重载,并且我想知道以下情况是否可能。 考虑以下假设/人为的类。 我知道上面写的方式,我可以做这样的事情 这些将按预期工作。我也知道目前的书写方式我无法做到这一点 有没有办法解决?我知道这个例子是人为设计的,但是我有一个应用程序,如果当我进行运算符重载时,为它定义运算符的类可以出现在运算符的右侧,它将非常有用。这可能在python中吗? 问题答案: 是。