python 在符号计算中,a**b和pow(a,

cczfrluj  于 2023-01-08  发布在  Python
关注(0)|答案(1)|浏览(77)

EDIT:将assert添加为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的性能比较,显示出微小的差异。
如果math.powsympy.Pow在任何情况下提供了任何优势,我欢迎澄清,我不认为我会执行繁重的计算,所以微小的性能差异可能不会影响我的用例。

cbjzeqam

cbjzeqam1#

在您的上下文中,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对象可以在各个方面都是等价的,但仍然是不同的对象。例如,您不应该依赖于在未来的SymPy实现中给出的对象标识。)
此外,Python文档规定:
双参数形式pow(base, exp)等效于使用幂运算符: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

相关问题