Python中的指数 - 我应该更喜欢**运算符而不是math.pow和math.sqrt吗?

hel*_*ker 57 python math exponentiation

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

在numpy中,我做了以下事情:

result = numpy.sqrt(numpy.sum(numpy.pow(some_vector, 2)))
Run Code Online (Sandbox Code Playgroud)

在纯python中会出现这样的情况:

result = math.sqrt(math.pow(A, 2) + math.pow(B,2)) # example with two dimensions.
Run Code Online (Sandbox Code Playgroud)

但是,我一直在使用这种纯Python形式,因为我发现它更紧凑,独立于导入,看似相同:

result = (A**2 + B**2)**0.5   # two dimensions
result = (A**2 + B**2 + C**2 + D**2)**0.5
Run Code Online (Sandbox Code Playgroud)

我听说有些人认为**运算符是一种黑客攻击,并且通过对它进行取幂来对数字进行求数0.5是不可读的.但我想问的是:

"有没有任何计算理由更喜欢前两种替代品而不是第三种替代品?"

谢谢阅读!

Sha*_*ank 53

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

有关**和之间区别的更多信息,请参阅此Stack Overflow问题math.sqrt.

就其中更"Pythonic"而言,我认为我们需要讨论该词的定义.从官方的Python术语表中可以看出,如果一段代码或想法"严格遵循Python语言中最常见的习语,而不是使用其他语言常用的概念来实现代码",那么它就是Pythonic.在我能想到的每一种其他语言中,都有一些带有基本平方根函数的数学模块.然而,有些语言缺乏像**C++ 这样的幂运算符.所以**可能更像Pythonic,但它是否客观上更好取决于用例.


650*_*502 16

即使在基础Python中,您也可以通用形式进行计算

result = sum(x**2 for x in some_vector) ** 0.5
Run Code Online (Sandbox Code Playgroud)

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

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

我经常使用它x ** 0.5只是因为我不想math仅为此添加.然而,我期望平方根的特定指令比具有对数的多步操作更好(更准确).

  • 显然[既不更准确](http://stackoverflow.com/a/842358/199360) - 但[sqrt更快](http://stackoverflow.com/a/327011/199360). (2认同)