什么“S”在同情中表示

时间:2017-01-25 19:43:31

标签: python sympy

我是sympy的新手,我无法弄清楚

from sympy.core import S

实际上S是什么? S.true是什么意思?

2 个答案:

答案 0 :(得分:12)

有点混乱,因为S实际上是两件事。

首先是SingletonRegistry SymPy中的几个类经常出现,因为它们是 singletonized ,也就是说,使用一些元编程它们是这样做只能实例化一次。例如,每次创建Integer(0)时,都会返回相同的实例Zero。所有单例实例都是S对象的属性,因此Integer(0)也可以作为S.Zero进行访问。

Singletonization提供两个优点:它可以节省内存,并且可以进行快速比较。它节省了内存,因为无论单例化对象出现在内存中的表达式中多少次,它们都指向内存中的相同单个实例。快速比较来自于您可以使用is来比较Python中的确切实例(通常,您需要使用==来比较事物)。因此,您可以测试a is S.Zero以检查a是否为Integer(0)实例。

在大多数情况下,某些对象是单例化的这一事实是一个您不应该担心的实现细节。 S对最终用户的主要优势是可以方便地访问难以输入的特定实例,例如S.Half(而不是Rational(1, 2))或S.true(侧面)注意:S.trueTrue的SymPy版本。与True不同,它不是int的子类,因此您可以编写~S.true之类的内容(不是真的) )它会给S.false(与~True形成对比,后者给出-2,这不是布尔值的假。)

第二件事是sympify的快捷方式。 sympify是将int(1)等Python对象转换为SymPy对象的函数,例如{ {1}}。它还将表达式的字符串形式转换为SymPy表达式,如Integer(1)sympify(x**2) -> Symbol("x")**2S(1)相同(基本上,sympify(1)已被定义为调用S.__call__)。

这是为了方便起见,因为sympify是一个字母。它主要用于定义有理数。考虑像S这样的表达式。如果你直接在Python中输入它,它将评估x + 1/2并在Python 2中给出1/2(或仅0.5,因为整数除法),因为两个参数都是{{1} }秒。但是,在SymPy中,通常需要两个整数的商来给出一个精确的有理数。 Python的评估工作方式,运营商的至少一方需要成为SymPy评估接管的SymPy对象。您可以将其写为0,但这样可以输入更多内容。较短的版本是int。由于x + Rational(1, 2)会返回x + S(1)/2,因此该部门将返回S(1)类型,因为它会调用Integer(1),它知道如何返回Rational

答案 1 :(得分:1)

许多人已经联系起来,S用于访问单身人士。根据{{​​3}},class SingletonRegistryS的实例。 S.One做了两件事:

  • 可让您访问代表基本常量的S.ZeroS(1)等实例
  • 允许您根据其值创建或访问表示常量的单例(例如is)。

使用单例的原因是您可以使用==而不是is来比较对象。 1速度更快,但只有在您知道确定1与您正在测试的>>> Basic() is Basic() False >>> MySingleton() is MySingleton() True >>> S.MySingleton is MySingleton() True 相同才有效。 the source举了一个例子:

    def test(tocheck):

        count = 0

        for number in range(1, 1000):

            for div in tocheck:
                if not number % div:
                    break
            else:
                #else on a loop means it ran to completion w.o. break
                count += 1

        print("%d not divisible by %s" % (count, tocheck))


    test([2,3,5])
    test([2,3,5,7])