gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:58:33 26 4
gpt4 key购买 nike

编辑:添加断言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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com