资讯详情

资讯详情

SymPy 依赖指南:硬依赖、可选依赖与开发依赖全解析

SymPy 依赖指南硬依赖、可选依赖与开发依赖全解析【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympySymPy 是一个用纯 Python 编写的计算机代数系统其核心代码库对第三方库的依赖非常克制整个运行只有 mpmath 一个硬依赖其余均为按需启用的可选依赖。本文以仓库文档 doc/src/contributing/dependencies.md 为主干结合 sympy/init.py、sympy/external/importtools.py、sympy/external/gmpy.py、sympy/core/backend.py 等源码实现系统梳理 SymPy 的依赖全景哪些是必须安装的、哪些能显著提升性能、哪些只服务于特定功能绘图、解析、SAT、代码生成、统计采样等以及贡献者在测试、文档、基准测试场景下还需要哪些开发依赖。读完本文你将能根据使用场景精准决定需要安装哪些包并理解 SymPy 如何在缺失依赖时优雅降级或跳过测试。依赖总览与定位SymPy 的依赖可以划分为三个层次层次典型包缺失后果硬依赖mpmathimport sympy直接失败推荐可选依赖gmpy2功能正常但大整数与多项式运算性能下降功能型可选依赖matplotlib、lark、pycosat、numpy 等仅对应功能绘图、解析、SAT 求解、lambdify 后端等不可用或降级开发依赖git、pytest、hypothesis、cloudpickle、asv 等影响测试运行、文档构建与基准测试文档特别强调了两点边界文中列出的是SymPy 依赖的包而非依赖 SymPy 的包反向依赖清单可在主站点与依赖图谱中查看不在本文讨论范围。绝大多数用户与贡献者不需要安装下面提到的任何包除硬依赖 mpmath除非他们打算使用或参与开发依赖这些包的功能模块。仓库根目录的 pyproject.toml 与 requirements-dev.txt 可以交叉印证上述分层requirements-dev.txt首行即mpmath随后是mypy、sphinx-lint、pytest、hypothesis、ruff、slotscheck等纯开发/工具链包而 gmpy2、matplotlib 等运行期可选依赖并未出现在其中——它们由各功能模块在运行时按需检测。硬依赖mpmathSymPy 唯一的硬依赖是mpmath一个纯 Python 的任意精度算术库。它被用于 SymPy 计算函数浮点数值的一切底层场景例如evalf见 sympy/core/evalf.py。在 sympy/init.py 中SymPy 在导入阶段就强制校验 mpmathimport mpmath ... raise ImportError(SymPy now depends on mpmath as an external library. See https://docs.sympy.org/latest/install.html#mpmath for more information.)如果导入时报出上述ImportError说明 mpmath 没有被正确安装。绝大多数安装 SymPy 的方式如pip install sympy、conda 安装都会自动带上 mpmath只有在直接基于 git 仓库开发、并未真正安装 SymPy 的情况下才需要手动补齐 mpmath。源码层面SymPy 将大量对 mpmath 的直接访问集中收敛在 sympy/external/mpmath.py 中并做了版本兼容处理例如针对 mpmath 1.4.0 与 1.5 的 API 差异做了分支适配mpf_log/mpf_ln、repr_dps。此外该模块还提供conserve_mpmath_dps装饰器与local_workprec上下文管理器用于在函数调用前后保持/借用 mpmath 的全局精度mpmath.mp.dps这说明 SymPy 不仅依赖 mpmath还深度管理其精度上下文避免高精度运算相互污染。推荐可选依赖gmpy2gmpy2 是 GMP 多精度库的 Python 封装提供比 Python 内置int更快的大整数。SymPy 在安装 gmpy2 后自动启用无需任何额外配置。文档建议所有有条件的用户安装它以提升整体体验。从源码 sympy/external/gmpy.py 可以看出其自动探测机制_SYMPY_GROUND_TYPES os.environ.get(SYMPY_GROUND_TYPES, auto).lower() def _get_gmpy2(sympy_ground_types): if sympy_ground_types not in (auto, gmpy, gmpy2): return None gmpy import_module(gmpy2, min_module_version_GMPY2_MIN_VERSION, module_version_attrversion, module_version_attr_call_args()) if sympy_ground_types ! auto and gmpy is None: warn(gmpy2 library is not installed, switching to python ground types) return gmpy要点如下环境变量SYMPY_GROUND_TYPES可取auto、gmpy、gmpy2、python、flint默认autoauto模式下优先使用 flint其次 gmpy2最后回落到 Python 原生类型。gmpy2 版本必须不低于_GMPY2_MIN_VERSION源码中限定gmpy2 2.0.0才会被采用且由于 gmpy2 的version()是函数而非__version__属性探测时特意传入了module_version_attrversion、module_version_attr_call_args()。若明确指定gmpy/gmpy2却未安装会输出 gmpy2 library is not installed, switching to python ground types 警告并自动降级而不是崩溃。gmpy2 之所以只是推荐而非硬依赖是因为它依赖非 Python、且非 BSD 许可证的 GMP 库。它主要加速对整数运算敏感的核心函数尤其是 sympy/polys多项式系统。而 polys 又被积分算法、collect()、factor()等化简算法、矩阵模块以及部分 core 代码广泛使用因此安装 gmpy2 能间接加速 SymPy 的很多场景。配套的纯 Python 回退实现位于 sympy/external/ntheory.py该文件开头即注明提供一些在安装了 gmpy2 时会被替换使用的数论函数的纯 Python 实现如bit_scan1/bit_scan0等。交互式使用相关依赖SymPy 同时面向交互式与库两种使用方式。交互场景下它可与 IPython、Jupyter Notebook 无缝集成IPythoninit_session()函数与isympy命令在检测到 IPython 时会自动启动它。除 IPython 自身的增强外这还开启了 matplotlib 交互绘图且auto_symbols、auto_int_to_Integer等标志仅在 IPython 中生效。另外运行 sympy/interactive 下的部分测试也需要 IPython 包。Jupyter Notebook 与 Qt ConsoleSymPy 表达式在 Jupyter Notebook 中自动以 MathJax 渲染在 Qt Console 中配合 LaTeX以 LaTeX 渲染。入口实现位于 sympy/interactive/session.py 与 sympy/interactive/printing.py。打印相关依赖preview()函数负责把 SymPy 表达式转换为由 LaTeX 渲染的图片可保存到文件或调用查看器展示。因此LaTeX 发行版TeX Live 或 MiKTeX是preview()工作的前提不安装 LaTeX 时预览功能不可用但不会影响其他打印方式如 pretty print、str、MathJax 渲染。解析Parsing相关依赖sympy/parsing 子模块中部分解析器需要外部依赖但并非全部Python 解析器parse_expr、Mathematica 解析器parse_mathematica、Maxima 解析器parse_maxima均不需要任何外部依赖。antlr-python-runtime / antlr4-python3-runtimeLaTeX 解析器parse_latex见 sympy/parsing/latex与 Autolev 解析器见 sympy/parsing/autolev依赖 ANTLR Python 运行时。特别注意运行时版本必须与编译解析器时使用的 ANTLR 版本4.10一致。conda 包名为antlr-python-runtimepip 包名为antlr4-python3-runtime。lark可作为parse_latex的替代后端不装 ANTLR 时的另一条路径。Clang Python BindingsC 解析器sympy.parsing.c.parse_c需要 Clang Python 绑定conda 包名python-clangpip 包名clang。lfortranFortran 解析器sympy/parsing/fortran需要 LFortran。逻辑Logic与 SAT 求解器satisfiable()内置纯 Python 的 DPLL 可满足性算法但可选用更快的 C 语言 SAT 求解器后端。注意satisfiable()也被ask()内部使用pycosat安装后自动使用也可通过satisfiable(algorithmpycosat)强制指定。pysat封装多种 SAT 求解器的库目前只实现了 Minisat 后端通过satisfiable(algorithmminisat22)调用注意文档原文为minisat22实际使用时为字符串minisat22。核心实现位于 sympy/logic/inference.py。绘图相关依赖sympy/plotting/plot.py 重度依赖外部绘图库来渲染图形matplotlib绝大部分绘图功能要求安装 Matplotlib。没有它时大多数绘图函数会失败或退化为简陋的文本图textplot见 sympy/plotting/textplot.py。pyglet子模块 sympy/plotting/pygletplot 通过 pyglet 实现 2D/3D 交互绘图该模块源码大量依赖 pyglet 的Window、App等接口。lambdify数值后端依赖lambdify是 SymPy 与数值库之间的标准桥梁把符号表达式转换为可被数值求值的 Python 函数。它天然支持任何用户以第三个参数传入命名空间字典的库同时内置了对多个流行数值库的翻译支持后端启用方式说明NumPy默认已安装时未安装时回退到标准库math主要为向后兼容SciPy自动求解 NumPy 未覆盖的部分特殊函数CuPylambdify(modulescupy)CUDA GPU 上的 NumPy 兼容接口JAXlambdify(modulesjax)基于 XLA可在 GPU/TPU 上编译运行TensorFlowlambdify(modulestensorflow)机器学习生态NumExprlambdify(modulesnumexpr)NumPy 的快速数值表达式求值器mpmath内置支持输出纯 mpmath 函数mpmath 本就是硬依赖源码 sympy/utilities/lambdify.py 中可看到其后端探测逻辑先检查numexpr是否出现在 modules 列表且列表长度大于 1随后依次探测cupy、jax、numexpr、tensorflow命名空间是否可用。其 doctest 也标注依赖[numpy, tensorflow]等模块与文档描述一致。代码生成Code Generation相关依赖SymPy 可以为大量语言生成代码见 sympy/codegen 与 sympy/printing。重点澄清这些依赖不是支持的语言清单——对大多数语言SymPy 只生成字符串形式的代码因此不需要安装对应语言的编译器依赖通常只在把生成的代码自动编译为 Python 可调用函数时才需要。lambdify是该模式的特殊情况其依赖已在上节列出。Autowrap 工具链NumPy 及其 f2py 子包可用于autowrap()/ufuncify()生成 Python 函数。Cython可作为autowrap/ufuncify的后端也用于部分sympy.codegen测试中的示例编译。编译器Compilersautowrap、ufuncify及相关函数依赖编译器把生成代码编译为函数。绝大多数主流 C、C、Fortran 编译器都受支持包括 Clang/LLVM、GCC、ifort。代码打印器Code Printers多数代码打印器只生成 Python 字符串无需对应库或编译器少数例外llvmlite模块sympy.printing.llvmjitcode见 sympy/printing/llvmjitcode.py支持从 SymPy 表达式生成 LLVM JIT其llvm_callable()函数生成可调用函数依赖 llvmliteLLVM 的 Python 封装。TensorFlow模块sympy.printing.tensorflow见 sympy/printing/tensorflow.py的tensorflow_code()确实生成 Python 字符串与上述两个模块不同。但若本机装有 TensorFlow 会被导入以自动检测版本未安装时则假定使用最新的受支持版本。仅测试用依赖Wurlitzer用于捕获 C 扩展的输出仅被sympy.codegen的部分测试使用不参与任何终端用户功能未安装时相关测试被跳过。Cython部分sympy.codegen测试用它编译示例。编译器前面提到的各种编译器在已安装时用于 codegen 与 autowrap 测试。统计采样相关依赖sympy.stats.sample()需要至少一个外部库来产生分布样本SciPysample(libraryscipy)为默认后端使用scipy.stats。NumPysample(librarynumpy)使用 NumPy random 模块。PyMCsample(librarypymc)使用 PyMC 采样。实现位于 sympy/stats 子模块如 sympy/stats/rv_interface.py。可选的 SymEngine 后端SymEngine 是一个 C 编写的高速符号运算库其 Python 绑定可作为 SymPy core 的可选后端安装绑定pip install symengine或conda install -c conda-forge python-symengine以环境变量运行USE_SYMENGINE1。源码 sympy/core/backend.py 的实现是USE_SYMENGINE os.getenv(USE_SYMENGINE, 0) USE_SYMENGINE USE_SYMENGINE.lower() in (1, t, true) if USE_SYMENGINE: from symengine import (Symbol, Integer, sympify as sympify_symengine, ...) else: from sympy.core.add import Add ...当前该后端只被sympy.physics.mechanics与sympy.liealgebras模块使用但也可以直接通过sympy.core.backend与其交互 from sympy.core.backend import Symbol # 若配置了 USE_SYMENGINE 环境变量将创建 SymEngine 的 Symbol 对象 # 否则是普通的 SymPy Symbol 对象。 x Symbol(x)SymEngine 后端目前仍属实验性启用后部分 SymPy 函数可能无法正常工作。backend.py中还包含针对 SymEngine 0.7.0 矩阵simplify()行为不一致问题的兼容函数_simplify_matrix可作为其未完全成熟的一个佐证。Sage 集成Sage 是聚合了大量开源数学库的数学软件SymPy 是其所用库之一。大部分 SymPy 与 Sage 的对接代码位于 Sage 自身SymPy 只提供少量_sage_方法用于基础的 wrapper 搭建这些方法通常只应由 Sage 内部调用。从仓库结构看_sage_相关代码散布在各表达式类中例如sympy/core/expr.py等处的_sage_方法与文档描述一致。开发依赖SymPy 的常规开发不需要 Python 与 mpmath 之外的任何额外依赖。获取源码gitSymPy 源码使用 git 版本控制。从 git 获取开发版 SymPy 的方式见安装指南与贡献者指南doc/src/contributing/introduction-to-contributing.md。运行测试基础测试不要求额外依赖但上文的可选依赖中有相当一部分是某些测试所需的。未安装时依赖它们的测试应当被跳过方式有两种调用sympy.testing.pytest.skip()见 sympy/testing/pytest.py在测试文件级设置skip True跳过整个文件。测试与库代码中对可选模块的导入一律使用import_module()。其实现位于 sympy/external/importtools.py核心行为如下模块未安装时返回None并可选发出UserWarning支持min_module_version通过module_version_attr指定版本属性默认__version__必要时用module_version_attr_call_args调用函数取值与min_python_version双重版本门槛通过catch参数额外捕获导入时抛出的非ImportError异常例如 matplotlib 在无显示环境抛RuntimeError模块级开关WARN_NOT_INSTALLED默认 False与WARN_OLD_VERSION默认 True可全局控制警告行为设置环境变量SYMPY_DEBUGTrue会同时打开两类警告便于调试。具体测试依赖pytest并非 SymPy 测试套件的必需依赖。SymPy 自带测试运行器在源码目录执行python bin/test或调用sympy.test()当然也可用 pytest 替代但测试代码应使用 sympy/testing/pytest.py 中的包装函数而非直接使用 pytest 函数。仓库根目录 pyproject.toml 的[tool.pytest.ini_options]配置了默认排除slow/tooslow标记用例、限定testpaths [sympy, doc/src]等行为可直接运行。cloudpickle比内置pickle更高效地序列化 SymPy 对象仅 sympy/utilities/tests/test_pickling.py 中的部分测试依赖它。hypothesisSymPy 测试套件的必需依赖用于基于属性的测试。环境变量相关SymPy 的测试基础设施还支持SYMPY_GROUND_TYPES、USE_SYMENGINE等开关可结合上文验证不同 ground type 下的行为。构建文档构建文档需要额外的若干依赖Sphinx 及插件、sphinx-lint等详见文档构建指南doc/README.rst 与 doc/src/contributing/docstring.rst。只有当你正在为 SymPy 贡献文档、需要验证 HTML/PDF 渲染效果时才需要安装它们只想阅读开发版文档的用户可直接访问在线 dev 构建。运行基准测试基准测试代码托管在独立仓库其运行方法由该仓库的 README 说明。asvAirspeed Velocity是运行基准测试的包安装的包名就是asv。SymPy 仓库内的基准测试代码位于 sympy/benchmarks 与各模块的benchmarks/目录如 sympy/core/benchmarks。基准测试也会在 GitHub Actions CI 上自动运行普通贡献者一般无需自行执行除非要复现结果或新增基准用例。总结如何选择安装你的使用场景需要安装仅导入并使用 SymPy 基本功能mpmath自动随 SymPy 安装追求大整数/多项式运算性能gmpy2推荐交互式使用 / 笔记本IPython、Jupyter可选 Qt Console LaTeX使用preview()渲染图片LaTeX 发行版TeX Live / MiKTeX使用 LaTeX/Autolev 解析antlr 运行时版本须匹配 4.10或 lark使用 C/Fortran 解析Clang Python 绑定 / LFortran加速 SAT 求解pycosat 或 pysat绘图matplotlib必需、pyglet可选lambdify 数值后端numpy、scipy、cupy、jax、tensorflow、numexpr 按需autowrap / ufuncifynumpyf2py、cython、C/C/Fortran 编译器sympy.stats 采样scipy默认、numpy、pymc 之一启用 SymEngine 后端python-symengine USE_SYMENGINE1运行完整测试套件pytest或内置bin/test、hypothesis必需、cloudpickle、wurlitzer 等构建文档 / 运行基准Sphinx 工具链 / asv核心原则贯穿始终SymPy 保持极低的依赖门槛所有可选依赖都通过import_module()等机制按需探测、优雅降级。理解这份依赖地图无论你是普通用户、数值计算工程师还是 SymPy 贡献者都能精准安装所需组件、避免不必要的依赖冲突并在 CI 与本地环境之间保持一致的行为。【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →