a**b 和 pow(a,b) 在符号计算中有何区别

san*_*ica 2 python sympy exponentiation pow

编辑:按照 Wrzlprmft 的建议添加assert不会引发任何异常。

a**b在以下情况下,我必须编写具有许多类型表达式的代码

import sympy as sp
a, b = sp.symbols('a,b', real=True, positive=True)

expr1 = a**b
expr2 = pow(a,b)

assert expr1 is expr2
Run Code Online (Sandbox Code Playgroud)

a**b和之间的预期/可能差异是什么pow(a,b) (例如,当简化、收集等表达式时)。
在任何情况下我都应该预料到可能出现的错误结果吗?

到目前为止,我还没有找到。
我认为我不会使用第三个参数,pow因为我的基数是实数(指数通常是整数或一位或两位整数之间的比率),所以这个这个不相关。
thisthis 的重点是与 的比较math.pow,尽管有些答案也包括两者**pow的性能比较,显示出细微的差异。没有一个问题/答案涉及sympy.

如果math.powsympy.Pow任何情况下提供任何优势,我欢迎澄清。我预计我不会执行繁重的计算,因此微小的性能差异可能不会影响我的用例。

Wrz*_*mft 5

在您的上下文中,a**bpow(a,b)尽可能相同:它们指的是同一个对象:

\n
import sympy as sp\na, b = sp.symbols(\'a,b\', real=True, positive=True)\n\nX = a**b\nY = pow(a,b)\n\nassert X is Y\n
Run Code Online (Sandbox Code Playgroud)\n

is检查 Python 中的对象身份。\n虽然实际应用程序很少需要这样的检查,但它可以为您的问题提供最简单的答案。\n(请注意,Python 对象在各个方面都可以是等效的,但仍然是不同的对象. 例如,您不应该\xe2\x80\x99 依赖于未来 SymPy 实现中给出的对象标识。)

\n

此外,Python 文档指定:

\n
\n

双参数形式pow(base, exp)相当于使用幂运算符:base**exp

\n
\n

因此,对于每个语言定义的任何参数,两者都是相同的,即pow(a,b)简单地调用a.__pow__(b)(这就是a**b幕后的作用)。我现在不想深入研究各自的源代码,但请考虑一下:

\n
class foo(object):\n    def __init__(self,name):\n        self.name = name\n    \n    def __pow__(self,other):\n        print(f"{self.name}.__pow__({other.name}) called")\n\na = foo("a")\nb = foo("b")\n\na**b         # a.__pow__(b) called\npow(a,b)     # a.__pow__(b) called\na.__pow__(b) # a.__pow__(b) called\n
Run Code Online (Sandbox Code Playgroud)\n