依赖项

此页面列出了 SymPy 的硬依赖项和可选依赖项。

安装后可以启用某些额外 SymPy 功能的几个软件包。大多数用户和贡献者无需安装下面提到的任何软件包(除了硬依赖项),除非他们打算使用或贡献可以利用这些软件包的 SymPy 部分。

下面列出的每个依赖项都可以通过 conda-forge 使用 conda 安装,大多数也可以通过 pip 安装。

此页面未列出自身依赖于 SymPy 的软件包,仅列出了 SymPy 依赖的软件包。可在 SymPy 主页

硬依赖项

SymPy 只有一个硬依赖项,它是其工作所必需的:mpmath。

  • mpmath: mpmath 是一个用于任意精度算术的纯 Python 软件包。它在 SymPy 计算函数的浮点值时使用,例如,使用 evalf 时。

    如果没有安装 mpmath,SymPy 将无法正常工作,并且在导入时将失败。如果你遇到类似以下的错误:

    ImportError: SymPy now depends on mpmath as an external library. See
    https://docs.sympy.cn/latest/install.html#mpmath for more information.
    

    这意味着您没有正确安装 mpmath。 此页面 说明了如何安装它。

    大多数安装 SymPy 的方法,例如在 安装 指南中概述的方法,会自动安装 mpmath。通常,只有在您没有实际安装 SymPy 的情况下才需要手动安装 mpmath,例如,如果您正在 git 存储库中直接开发 SymPy。

可选依赖项

这些依赖项不是使用 SymPy 所必需的。绝大多数 SymPy 函数不需要它们,但是,一些函数(例如绘图和自动包装生成的代码函数)需要额外的依赖项才能运行。

此外,作为贡献者,在运行 SymPy 测试时,如果缺少某些测试所需的依赖项,则这些测试将被跳过。在每个 SymPy 拉取请求上运行的 GitHub Actions CI 会在“可选依赖项”构建中自动安装这些依赖项,但是如果您正在处理使用它们的 SymPy 部分,您可能希望在本地安装它们。

交互式使用

SymPy 被设计为既可以交互式使用,也可以作为库使用。当交互式使用时,SymPy 能够与 IPython 和 Jupyter 笔记本交互。

  • IPython: init_session() 函数和 isympy 命令将在安装后自动启动 IPython。除了使用 IPython 的通常好处之外,这还使使用 matplotlib 进行交互式绘图成为可能。此外,一些标志(例如 auto_symbolsauto_int_to_Integer)仅在 IPython 中有效。

    要运行 sympy/interactive 中的一些测试,需要 IPython 包。

  • Jupyter Notebook 和 Qt Console: SymPy 表达式使用 MathJax 在 Jupyter Notebook 中自动打印,并在使用 LaTeX 的 Qt Console 中自动打印(如果安装了 LaTeX)。

打印

preview() 函数会自动将 SymPy 表达式转换为使用 LaTeX 渲染的图像。 preview() 可以将图像保存到文件或使用查看器显示。

解析

sympy.parsing 子模块中的几个函数需要外部依赖项才能运行。请注意,目前并非所有解析器都需要外部模块。Python (parse_expr())、Mathematica (parse_mathematica()) 和 Maxima (parse_maxima()) 解析器不需要任何外部依赖项。

  • antlr-python-runtime: ANTLR 可用于 LaTeX parser,并在 Autolev 解析器中使用。它们都需要安装 ANTLR Python 运行时。该软件包的名称为 antlr-python-runtime(使用 conda)和 antlr4-python3-runtime(使用 pip)。还要注意,ANTLR Python 运行时的版本必须与用于编译 LaTeX 和 Autolev 解析器(4.10)的版本匹配。

  • lark: Lark 可用作 LaTeX parser 的备用后端。

  • Clang Python 绑定: C 解析器 (sympy.parsing.c.parse_c) 需要 Clang Python 绑定。该软件包的名称为 python-clang(使用 conda)和 clang(使用 pip)。

  • lfortran: Fortran 解析器(位于 sympy.parsing.fortran 中)需要 LFortran

逻辑

satisfiable() 函数包含 DPLL 可满足性算法的纯 Python 实现。但如果安装了更快的 C SAT 求解器,它可以选择使用更快的 C SAT 求解器。请注意, satisfiable() 也被 ask() 使用。

  • pycosat: 如果安装了 Pycosat,它将被自动使用。可以使用 satisfiable(algorithm='pycosat') 强制使用 pycosat。

  • pysat: Pysat 是一个包装了许多 SAT 求解器的库。它也可以用作 satisfiable() 的后端。目前,仅实现了 Minisat,使用 satisfiable(algorithm=minisat22')

绘图

sympy.plotting.plot 模块大量使用外部绘图库来渲染绘图。支持的主要绘图模块是 Matplotlib。

  • matplotlib: 大多数绘图功能都需要 Matplotlib 绘图库。如果未安装 Matplotlib,大多数绘图函数将失败或给出基本 文本绘图

  • pyglet: SymPy 有一个子模块 sympy.plotting.pygletplot,它可以用于与 pyglet 模块交互以进行 2D 和 3D 绘图。

lambdify

lambdify() 是一个函数,它将 SymPy 表达式转换为可以使用各种库作为后端以数字方式计算的函数。 lambdify 是用户在 SymPy 和这些库之间交互的主要方式。它是将符号 SymPy 表达式转换为可计算的数值函数的标准方法。

原则上,如果用户在第三个参数中传入适当的命名空间字典,lambdify 能够与任何外部库交互,但默认情况下,lambdify 了解一些流行的数值 Python 库。这些库在 lambdify 中被启用为后端,并具有内置的转换来将 SymPy 表达式转换为这些库的适当函数。

  • NumPy: 默认情况下,如果安装了 NumPylambdify 将使用 NumPy 创建函数(如果未安装 NumPy,lambdify 将使用标准库 math 模块生成函数,尽管此行为主要是为了向后兼容而提供的)。

  • SciPy: 如果安装了 SciPylambdify 将自动使用它。SciPy 必须被 lambdify 才能对 NumPy 中未包含的某些 特殊函数 进行 lambdify。

  • CuPy: CuPy 是一个库,它为 CUDA GPU 提供了与 NumPy 兼容的接口。 lambdify 可以使用 lambdify(modules='cupy') 生成与 CuPy 兼容的函数。

  • Jax: JAX 是一个使用 XLA 在 GPU 和 TPU 上编译和运行 NumPy 程序的库。 lambdify 可以使用 lambdify(modules='jax') 生成与 JAX 兼容的函数。

  • TensorFlow: TensorFlow 是一个流行的机器学习库。 lambdify 可以使用 lambdify(modules='tensorflow') 生成与 TensorFlow 兼容的函数。

  • NumExpr: NumExpr 是 NumPy 的快速数值表达式评估器。 lambdify 可以使用 lambdify(modules='numexpr') 生成与 NumExpr 兼容的函数。

  • mpmath: lambdify 也可以生成与 mpmath 兼容的函数。请注意,mpmath 已经是 SymPy 的 必需依赖项。此功能对于将 SymPy 表达式转换为与纯 mpmath 一起使用的函数很有用。

代码生成

SymPy 可以 生成代码 用于大量语言,方法是将 SymPy 表达式转换为这些语言的有效代码。它还具有针对某些语言自动编译和运行代码的功能。

请注意,以下依赖项 **不是** SymPy 可以为其生成代码的支持语言列表。而是 SymPy 可以以某种方式与之交互的软件包列表。对于 SymPy 支持代码生成的大多数语言,它只是生成表示该语言代码的字符串,因此不需要依赖该语言来使用代码生成功能。通常,仅当功能自动获取生成的代码并将其编译为可以在 Python 中使用的函数时才需要依赖项。请注意,lambdify() 是这种情况的特例,但它的依赖项在 上面 列出。

自动包装

  • 编译器: autowrap()ufuncify() 及其相关函数依赖于编译器来将生成的代码编译为函数。大多数标准 C、C++ 和 Fortran 编译器都支持,包括 Clang/LLVMGCCifort

代码打印机

大多数代码打印机生成 Python 字符串,因此不需要给定的库或语言编译器作为依赖项。但是,一些代码打印机生成 Python 函数而不是字符串。

  • Aesara: sympy.printing.aesaracode 模块包含使用 Aeseara(以前称为 Theano)库将 SymPy 表达式转换为函数的函数。Aesara 代码生成函数返回 Aesara 图对象。

  • llvmlite: sympy.printing.llvmjitcode 模块支持从 SymPy 表达式生成 LLVM Jit。这些函数使用 llvmlite,这是 LLVM 的 Python 包装器。 llvm_callable() 函数生成可调用函数。

  • TensorFlow: sympy.printing.tensorflow 模块支持使用 TensorFlow 生成函数,这是一个流行的机器学习库。与上面两个示例不同,tensorflow_code() 函数 **确实** 生成 Python 字符串。但是,如果可用,则会导入 tensorflow 以自动检测 TensorFlow 版本。如果未安装,tensorflow_code() 函数将假设最新支持的 TensorFlow 版本。

仅测试依赖项

  • Wurlitzer: Wurlitzer 是一个 Python 包,允许捕获来自 C 扩展的输出。它被 sympy.codegen 子模块中的一些测试使用。它仅供测试套件使用。它不供任何最终用户功能使用。如果未安装,则某些测试将被跳过。

  • Cython: Cython 也用于 sympy.codegen 中的一些测试以编译一些示例。

  • 编译器: 如果安装了上面提到的各种 编译器,它们将用于代码生成和自动包装中的某些测试。

统计

sympy.stats.sample() 函数使用外部库从给定分布中生成样本。要使用 sympy.stats 的采样功能,至少需要以下库之一。

  • SciPy: sample(library='scipy') 是默认值。这使用 scipy.stats

  • NumPy: sample(library='numpy') 使用 NumPy 随机模块

  • pymc: sample(library='pymc') 使用 PyMC 进行采样。

可选的 SymEngine 后端

  • python-symengine: SymEngine 是一个用 C++ 编写的快速符号操作库。SymEngine Python 绑定可以用作 SymPy 内核的可选后端。为此,请首先安装 SymEngine Python 绑定(使用 pip install symengineconda install -c conda-forge python-symengine)并在使用 USE_SYMENGINE=1 环境变量的情况下运行 SymPy。

    目前,SymEngine 后端仅供 sympy.physics.mechanicssympy.liealgebras 模块使用,尽管您也可以通过从 sympy.core.backend 导入内容来直接与 SymPy 的 SymEngine 后端交互。

    >>> from sympy.core.backend import Symbol
    >>> # This will create a SymEngine Symbol object if the USE_SYMENGINE
    >>> # environment variable is configured. Otherwise it will be an ordinary
    >>> # SymPy Symbol object.
    >>> x = Symbol('x')
    

    SymEngine 后端支持仍处于实验阶段,因此某些 SymPy 函数在启用它时可能无法正常工作。

Sage

Sage 是一款开源数学软件,它集成了大量开源数学库。SymPy 是 Sage 使用的库之一。

大多数用于在 SymPy 和 Sage 之间进行交互的代码都在 Sage 本身中,但 SymPy 中的一些 _sage_ 方法执行一些非常基本的 Sage/SymPy 包装器设置。这些方法通常应仅由 Sage 本身调用。

开发依赖项

通常情况下,在 SymPy 上进行开发不需要除 Python 和 mpmath 之外的任何其他依赖项。

获取源代码

运行测试

基本 SymPy 测试不需要任何其他依赖项,但是某些测试可能需要上面提到的大多数依赖项才能运行。依赖可选依赖项的测试应该在未安装时跳过,方法是使用 sympy.testing.pytest.skip() 函数或将 skip = True 设置为跳过整个测试文件。测试和 SymPy 库代码中的可选模块应使用 import_module() 导入。

  • pytest: Pytest 不是 SymPy 测试套件的必需依赖项。SymPy 有自己的测试运行器,可以通过 SymPy 源目录中的 bin/test 脚本或 test() 函数访问。

    但是,如果您更喜欢使用 pytest,则可以使用它来运行测试而不是 SymPy 测试运行器。SymPy 中的测试应该使用 sympy.testing.pytest 中的包装器,而不是直接使用 pytest 函数。

  • Cloudpickle: cloudpickle 包可用于比内置 Python pickle 更有效地对 SymPy 对象进行序列化。sympy.utilities.tests.test_pickling.py 中的一些测试依赖于 cloudpickle 才能运行。在其他情况下,SymPy 的任何函数都不需要它。

  • hypothesis: Hypothesis 是 SymPy 测试套件的必要依赖项。

构建文档

构建文档需要一些额外的依赖项。此页面概述了这些依赖项以及如何安装它们。仅当您要为 SymPy 贡献文档并希望检查 HTML 或 PDF 文档是否正确渲染时,才需要安装这些依赖项。如果您只想查看 SymPy 开发版本的文档,则文档的开发版本在线托管在 https://docs.sympy.cn/dev/index.html 上。

运行基准测试

SymPy 的基准测试托管在 https://github.com/sympy/sympy_benchmarks 上。该存储库中的 README 说明了如何运行基准测试。

请注意,基准测试也会在 GitHub Actions CI 上自动运行,因此作为贡献者通常没有必要自己运行它们,除非您想在您的计算机上重现基准测试结果或向套件添加新的基准测试。

  • asv: Airspeed Velocity 是用于运行基准测试的包。请注意,您安装的包名称称为 asv