在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
实际上给出了与使用**
运算符不同的答案,并且确实存在一个计算理由来selectnumpy
或math
模块实现。 具体来说,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
。 然而,我希望平方根的一个具体的指令比对数的多步操作更好(更准确)。