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

时间:2013-09-23 17:40:26

标签: python math exponentiation

在我的领域中,对一些数字进行平方,一起操作它们并取结果的平方根是很常见的。这在毕达哥拉斯定理和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取幂来对数字求平方不是那么可读。但我想问的是:

“有没有任何计算理由更喜欢前两种替代品而非第三种?”

感谢阅读!

2 个答案:

答案 0 :(得分:52)

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

See this Stack Overflow question for more information on the difference between ** and math.sqrt.

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

答案 1 :(得分:15)

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

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

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

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

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

相关问题