依赖项¶
本页列出了 SymPy 的硬依赖和可选依赖。
有几个包,当安装后,可以启用某些额外的 SymPy 功能。大多数用户和贡献者不需要安装下面提到的任何包(除了硬依赖项),除非他们打算使用或贡献于那些可以使用这些包的 SymPy 部分。
以下列出的每个依赖项都可以通过 conda-forge 使用 conda 安装,大多数也可以使用 pip
安装。
本页面不列出依赖于 SymPy 的包,只列出 SymPy 依赖的包。依赖于 SymPy 的包的不完全列表可以在 SymPy 主页 找到,更完整的列表可以在 GitHub 或 libraries.io 找到。
硬依赖¶
SymPy 只有一个硬依赖,这是它工作所必需的:mpmath。
mpmath: mpmath 是一个用于任意精度算术的纯 Python 包。每当 SymPy 计算函数的浮点值时,例如在使用 evalf 时,它都在幕后使用。
如果没有安装 mpmath,SymPy 将无法正常工作,并且导入时会失败。如果你遇到类似错误
ImportError: SymPy now depends on mpmath as an external library. See https://docs.sympy.org/latest/install.html#mpmath for more information.
这意味着你没有正确安装 mpmath。此页面 解释了如何安装它。
安装 SymPy 的大多数方法,如 安装 指南中概述的方法,都会自动安装 mpmath。通常只有在没有实际安装 SymPy 的情况下才需要手动安装 mpmath,例如,如果您是在 git 仓库中直接开发 SymPy。
可选依赖项¶
这些依赖项不是使用 SymPy 所必需的。绝大多数 SymPy 函数不需要它们,然而,一些函数如绘图和自动包装生成的代码函数需要额外的依赖项才能运行。
此外,作为贡献者,在运行 SymPy 测试时,如果某些测试所需的依赖项未安装,这些测试将被跳过。每次 SymPy 拉取请求时运行的 GitHub Actions CI 会在“可选依赖项”构建中自动安装这些依赖项,但如果你正在开发使用这些依赖项的 SymPy 部分,你可能希望在本地安装它们。
推荐的附加依赖项¶
这些依赖项对于 SymPy 的功能不是必需的,但如果用户能够安装它们,建议所有用户都安装,因为它们将提高 SymPy 的总体性能。
gmpy2: gmpy2 是 GMP 多精度库 的 Python 封装。它提供了比内置 Python
int
更快的超大整数。当 gmpy2 安装后,某些操作整数的内核函数(如 polys)会自动使用它。更多详情请参见 Poly Domains 的参考文档。SymPy 在 gmpy2 安装后会自动使用它。无需进一步操作即可启用。这些多项式本身被SymPy的许多部分使用,例如积分算法、简化算法如
collect()
和factor()
、矩阵以及核心的一些部分。因此,安装gmpy2
可以加速SymPy的许多部分。它不是SymPy的必需依赖项,因为它使用了一个非Python库(GMP),该库也是非BSD许可的。然而,我们建议所有能够安装gmpy2
的用户这样做,以获得更好的SymPy体验。
交互使用¶
SymPy 被设计为既可以交互使用,也可以作为库使用。当交互使用时,SymPy 能够与 IPython 和 Jupyter 笔记本接口。
IPython:
init_session()
函数和isympy
命令如果安装了 IPython 会自动启动它。除了使用 IPython 的常规好处外,这还支持使用 matplotlib 进行交互式绘图。此外,一些标志如auto_symbols
和auto_int_to_Integer
仅在 IPython 中有效。运行 sympy/interactive 中的一些测试需要
IPython
包。Jupyter Notebook 和 Qt 控制台: SymPy 表达式在 Jupyter Notebook 中自动使用 MathJax 打印,并在安装了 LaTeX 的 Qt 控制台 中使用 LaTeX 打印。
打印¶
The preview()
函数会自动将 SymPy 表达式转换为使用 LaTeX 渲染的图像。preview()
可以将图像保存到文件中,或者使用查看器显示。
解析¶
在 sympy.parsing
子模块中的几个函数需要外部依赖才能运行。请注意,并非所有解析器在此时都需要外部模块。Python (parse_expr()
)、Mathematica (parse_mathematica()
) 和 Maxima (parse_maxima()
) 解析器不需要任何外部依赖。
antlr-python-runtime: ANTLR 可以用于
LaTeX 解析器
,并且在 Autolev 解析器中使用。它们都需要安装 ANTLR Python 运行时。这个包在 conda 中称为antlr-python-runtime
,在 pip 中称为antlr4-python3-runtime
。还要注意,ANTLR Python 运行时的版本必须与用于编译 LaTeX 和 Autolev 解析器的版本(4.10)匹配。Clang Python 绑定: C 解析器 (
sympy.parsing.c.parse_c
) 需要 Clang Python 绑定。这个包在 conda 中称为python-clang
,在 pip 中称为clang
。lfortran: Fortran 解析器(在
sympy.parsing.fortran
中)需要 LFortran。
逻辑¶
The satisfiable()
函数包含了一个纯Python实现的DPLL可满足性算法。但如果安装了更快的C SAT求解器,它可以选择性地使用这些求解器。注意,satisfiable()
也被 ask()
使用。
绘图¶
The 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:默认情况下,如果已安装,
lambdify
使用 NumPy 创建函数(如果未安装 NumPy,lambdify
会使用标准库 math 模块生成函数,尽管这种行为主要是为了向后兼容)。SciPy: 如果安装了 SciPy,
lambdify
将自动使用它。SciPy 需要用于 lambdify 某些 特殊函数,这些函数不包含在 NumPy 中。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()
是这种情况的一个特例,但其依赖项列在上面。
自动换行¶
NumPy: NumPy 及其子包 f2py(可选),可以使用
autowrap()
或ufuncify()
函数生成 Python 函数。Cython: Cython 可以作为
autowrap()
或ufuncify()
的后端使用。Cython 还被用于sympy.codegen
测试中的一些示例编译。
编译器:
autowrap()
,ufuncify()
, 以及相关函数依赖于编译器将生成的代码编译成函数。大多数标准的 C、C++ 和 Fortran 编译器都支持,包括 Clang/LLVM、GCC 和 ifort。
代码打印机¶
大多数代码打印机生成 Python 字符串,因此不需要将给定的库或语言编译器作为依赖项。然而,少数代码打印机生成 Python 函数而不是字符串:
Aesara:
sympy.printing.aesaracode
模块包含将 SymPy 表达式转换为使用 Aesara(以前称为 Theano)库的函数的函数。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 版本。
仅用于测试的依赖项¶
统计¶
函数 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 symengine
或conda install -c conda-forge python-symengine
),然后使用USE_SYMENGINE=1
环境变量运行SymPy。目前,SymEngine 后端仅由 sympy.physics.mechanics 和 sympy.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 包可以用于更有效地序列化 SymPy 对象,而不是使用 Python 内置的 pickle。
sympy.utilities.tests.test_pickling.py
中的一些测试依赖于 cloudpickle 来运行。除此之外,SymPy 的任何功能都不需要它。假设: Hypothesis 是 SymPy 测试套件的必要依赖。
构建文档¶
构建文档需要几个额外的依赖项。此页面概述了这些依赖项以及如何安装它们。只有在为SymPy贡献文档并希望检查HTML或PDF文档是否正确渲染时,才需要安装这些依赖项。如果您只想查看SymPy开发版本的文档,开发版本的文档在线托管在https://docs.sympy.org/dev/index.html。
运行基准测试¶
SymPy 的基准测试托管在 https://github.com/sympy/sympy_benchmarks。该仓库中的 README 解释了如何运行基准测试。
请注意,基准测试也会自动在 GitHub Actions CI 上运行,因此作为贡献者,通常不需要自己运行它们,除非你想在你的计算机上重现基准测试结果或向基准测试套件中添加新的基准测试。
asv: Airspeed Velocity 是用于运行基准测试的包。请注意,您安装的包名称是
asv
。