编辑:添加断言
为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**b
和 pow(a,b)
之间的预期/可能差异是什么?
(例如,在简化、收集表达式等时)。
在任何情况下我都应该预料到可能出现的错误结果吗?
到目前为止,我还没有找到。
我认为我不会使用 pow 的第三个参数,因为我的基数是实数(指数通常是整数或一位或两位整数之间的比率),所以 this或this不相关。
This或this重点是与 math.pow
进行比较,尽管有些答案在性能比较中还包括 **
和 pow
,显示出细微的差异。
没有一个问题/答案涉及 sympy
。
如果 math.pow
或 sympy.Pow
在任何情况下都能提供任何优势,我欢迎您的澄清。
我预计我不会执行繁重的计算,因此微小的性能差异可能不会影响我的用例。
最佳答案
在您的上下文中,a**b
和 pow(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/