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

标签 python sympy pow exponentiation

编辑:添加断言suggested by Wrzlprmft ,这不会引发任何异常。

在以下情况下,我必须编写具有许多 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

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

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

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

最佳答案

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

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

X = a**b
Y = pow(a,b)

assert X is Y

is 检查 Python 中的对象身份。 虽然这样的检查很少是实际应用所需要的,但它可以最简单地回答您的问题。 (请注意,Python 对象在各个方面都可以是等效的,但仍然是不同的对象。例如,您不应该依赖于 future SymPy 实现中给出的对象标识。)

此外,the Python documentation指定:

The two-argument form pow(base, exp) is equivalent to using the power operator: base**exp.

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

class foo(object):
    def __init__(self,name):
        self.name = name
    
    def __pow__(self,other):
        print(f"{self.name}.__pow__({other.name}) called")

a = foo("a")
b = foo("b")

a**b         # a.__pow__(b) called
pow(a,b)     # a.__pow__(b) called
a.__pow__(b) # a.__pow__(b) called

关于python - a**b 和 pow(a,b) 在符号计算中有何区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75028503/

相关文章:

c# - 嵌套的 Math.Pow(...) 行为怪异

c - Raspberry PI 中的幂函数

python - Matplotlib 线重叠/分辨率

python - 替换部分 sympy 表达式

python - 如何在 sympy 中使用常量 LETTER?

python - SymPy逻辑函数的同步替换

python - Model.save() 和 ModelForm.save() 按什么顺序调用

python - 获取给定语言环境的日期时间掩码

python - Sklearn LDA 分析不会生成二维

C++:pow() 优化有两个常量