在Python中求幂 – 我应该更喜欢**运算符而不是math.pow和math.sqrt?

在我的领域里,将一些数字平方,一起操作,并取结果的平方根是很常见的。 这是在毕达哥拉斯定理和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. 

然而,我一直在使用这种纯粹的Pythonforms,因为我发现它更紧凑,独立于import,看似等价:

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

我曾经听到一些人认为**运算符是一种黑客攻击,并且通过以0.5来幂数来排列数字是不太可读的。 但是我想问的是如果:

“有没有计算理由比第三个select前两个select?”

谢谢阅读!

math.sqrt是平方根的C实现,因此不同于使用实现Python内build的pow函数的**运算符。 因此,使用math.sqrt实际上给出了与使用**运算符不同的答案,并且确实存在一个计算理由来selectnumpymath模块实现。 具体来说,sqrt函数可能以最有效的方式实现,而**运算的是大量的基数和指数,对于平方根的具体情况可能未被优化。 另一方面,内置的pow函数处理一些额外的情况,如“复数,无限整数和模幂运算”。

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

就“Pythonic”而言,我认为我们需要讨论这个词的定义。 从官方的Python术语表中可以看出,Pythonic的一个代码或者想法是“紧密地遵循Python语言中最常见的习惯用法,而不是用其他语言通用的概念来实现代码”。 在我能想到的每一种其他语言中,都有一些基本平方根函数的math模块。 然而,有些语言缺乏象C ++这样的强大的运算符。 所以**可能更多Pythonic,但是否客观上更好取决于用例。

即使在基本的Python中,你也可以用通用的forms进行计算

 result = sum(x**2 for x in some_vector) ** 0.5 

x ** 2肯定不是破解,执行的计算是相同的(我用cpython源代码进行检查)。 我实际上发现它更易读(和可读性计数)。

使用相反的x ** 0.5来取平方根不会做与math.sqrt完全相同的计算,因为前者(可能)是使用对数计算的,后者可能是使用math处理器的特定数字指令计算的。

我经常使用x ** 0.5因为我不想为此添加math 。 然而,我希望平方根的一个具体的指令比对数的多步操作更好(更准确)。