ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SciPy 1.16.2 发布说明解析:首个支持 Windows on ARM 的稳定版与一批内存泄漏修复

SciPy 1.16.2 发布说明解析:首个支持 Windows on ARM 的稳定版与一批内存泄漏修复 SciPy 1.16.2 发布说明解析首个支持 Windows on ARM 的稳定版与一批内存泄漏修复【免费下载链接】scipySciPy library main repository项目地址: https://gitcode.com/gh_mirrors/sc/scipySciPy 1.16.2 是 1.16 系列的一个纯缺陷修复bug-fix版本相对 1.16.1 不引入任何新特性但它是 SciPy 历史上第一个在 PyPI 上提供 Windows on ARMWin-ARM64wheel 的稳定版本。本文将基于官方发布说明结合仓库源码逐一解读本版本修复的信号处理、优化、线性代数模块缺陷以及打包许可与 CI 基础设施层面的改动帮助读者理解这些修复背后的实现细节与升级价值。版本定位1.16 系列的一个纯修复版本SciPy 1.16.2 的性质与 SciPy 的版本发布节奏一致次要版本如 1.16.0承载新功能而第三位版本号patch release如 1.16.1、1.16.2只用于修复回归与缺陷不添加任何新功能、不改变公共 API 行为。因此1.16.x 用户升级到 1.16.2 是低风险操作主要收益是获得更稳健的内存管理、更正确的输入校验与更完整的平台支持。本版本共关闭了 10 个 issue、合入 16 个 pull request由 12 位贡献者共同完成名单见下文的 贡献者 一节其中 4 位是首次为 SciPy 贡献补丁的开发者。修复范围横跨scipy.signal、scipy.optimize、scipy.linalg三大子模块以及构建系统、打包与 CI 流水线。里程碑首个提供 Windows on ARM wheels 的稳定版本版本最醒目的新闻是1.16.2 是第一个在 PyPI 上提供 Windows on ARMARM64wheel 的 SciPy 稳定版本。此前 Windows on ARM 用户只能通过源码编译或第三方渠道使用 SciPy而本版本起可以像 x86 用户一样直接执行pip install scipy1.16.2pip 会根据平台自动选择win_arm64的 wheel 文件。围绕这一里程碑本版本合入了多条相关改动BLD: Windows Arm64 wheel supportPR #23122是核心的构建支持改动使官方构建流程能够产出 Win-ARM64 wheelCI: validate build on Win-ARM64PR #23133在 CI 中新增了对 Win-ARM64 构建的验证环节确保该平台产物可持续、可回归CI: bump OpenBLAS and cibuildwheel versionsPR #23154升级了 OpenBLAS 与 cibuildwheel为 ARM64 交叉/本机构建提供所需的构建工具链BUG: Skip installing gmpy2(test deps) for Win-ARM64PR #23403修复了 Win-ARM64 上测试依赖gmpy2安装失败的问题说明该平台在测试依赖层面也做了针对性适配。对希望在 ARM64 Windows 设备如 Surface Pro X 等上使用 SciPy 的开发者而言1.16.2 意味着可以告别繁琐的本地编译直接获得官方构建的二进制 wheel。信号处理模块scipy.signal的三处修复1.16.2 对scipy.signal合入了三项修复分别涉及频谱估计、时间序列分析与短时傅里叶变换。signal.periodogram修复内存泄漏Issue #23411 报告signal.periodogram存在内存泄漏。periodogram是功率谱密度估计的基础函数位于 scipy/signal/_spectral_py.py签名如下def periodogram(x, fs1.0, windowboxcar, nfftNone, detrendconstant, return_onesidedTrue, scalingdensity, axis-1):它负责对时间序列x计算周期图通过get_window生成窗函数默认boxcar矩形窗按detrend方式去趋势默认constant即减去均值做 FFT 并依据scaling输出功率谱密度density单位 V²/Hz或幅度谱spectrum单位 V²。在循环中反复调用该函数处理大量数据时内存泄漏会导致进程内存持续增长直至被 OOM 终止。本版本的修复合入的修复类 PR消除了这一隐患长期运行频谱分析任务的进程应升级到 1.16.2。signal.lombscargle不再原地修改输入数组Issue #23474 报告signal.lombscargle(precenterTrue)会修改调用者传入的输入数组。lombscargle用于处理不均匀采样的时间序列是天文等领域探测周期性信号的核心工具其实现位于 scipy/signal/_spectral_py.py。当前实现的签名已经演进为def lombscargle(x, y, freqs, *, normalizeFalse, weightsNone, floating_meanFalse):其中normalize可取值False/power、True/normalize或amplitudefloating_meanTrue时为每个频率独立求解一个未知的 y 偏移量。源码注释scipy/signal/_spectral_py.py明确指出The legacy concept of pre-centering entails removing the mean from parameterybefore processing, i.e., passingy - y.mean()instead of setting the parameterfloating_meantoTrue.即旧版中precenterTrue等价于先在输入上做y - y.mean()的去均值处理。若该去均值以 in-place 方式写回输入数组就会破坏调用方的数据。PR #23475signal.lombscargle: replace in-place input adjustments将 in-place 的输入调整改为安全方式确保函数不再修改外部传入的数组。升级后凡是在多处复用同一份数据的分析流程都不必担心lombscargle悄悄改动原数组。ShortTimeFFT移除 lru_cache消除无界缓存Issue #23414 指出ShortTimeFFT存在无界缓存问题PR #23457signal.ShortTimeFFT: Remove lru_cache decorators与 PR #23414 共同修复了它。ShortTimeFFT位于 scipy/signal/_short_time_fft.py提供短时傅里叶变换的类封装。从当前源码可以看到类内部已不再使用lru_cache装饰器而是改用两种受控的缓存机制cached_property如 scipy/signal/_short_time_fft.py只对一次性计算的属性做缓存显式单槽缓存字段例如_cache_post_padding、_cache_upper_border_begin、_cache_t、_cache_fscipy/signal/_short_time_fft.py。这些字段只保存最近一次调用的参数与返回值如_cache_t保存(args, return_value)_cache_f保存(current_state, return_value)当新调用的参数与上次相同时命中缓存否则直接覆盖。相比之下lru_cache会按调用参数无限累积缓存条目在长时间运行的信号处理程序中造成内存持续增长而单槽缓存固定只保留一个条目内存占用有上界。这一改动与periodogram的内存泄漏修复共同表明1.16.2 对信号处理路径上长期运行导致内存增长一类问题做了系统性清理。优化模块scipy.optimize的三处修复optimize.nnls修复内存泄漏Issue #23429 报告optimize.nnls存在内存泄漏。nnls求解非负最小二乘问题argmin_x || Ax - b ||_2^2, x 0实现在 scipy/optimize/_nnls.py基于 Lawson Hanson 的经典活跃集算法见其文档字符串引用的 [1]Lawson C., Hanson R.J., Solving Least Squares Problems, SIAM, 1995通过求解 KKT 条件迭代收敛。该函数签名如下def nnls(A, b, *, maxiterNone):其中maxiter默认为3 * nn为A的列数。函数入口还会做严格的输入校验A必须是 2D 数组、b必须是 1D或单列 2D数组、m维必须一致并对空列情况n 0提前返回。PR #23563fix memory leaks in optimize.nnls and linalg.sqrtm同时修复了nnls与linalg.sqrtm两处泄漏将二者放在同一个 PR 中处理说明泄漏的根因都位于它们共享的底层 C 实现路径上。optimize SLSQP为 maxiter 补充缺失的错误检查Issue #23430 报告optimize的 SLSQP 缺少对输入参数的错误检查PR #23442fix regression for non-integer maxiter in SLSQP修复了非整数maxiter导致的回归。SLSQP 的 Python 入口是 scipy/optimize/_slsqp_py.py 中的_minimize_slsqpdef _minimize_slsqp(func, x0, args(), jacNone, boundsNone, constraints(), maxiter100, ftol1.0E-6, iprint1, dispFalse, ...):在初始化内部求解器状态时代码将maxiter传入 C 求解器state_dict { ... itermax: int(maxiter), ... }见 scipy/optimize/_slsqp_py.py。如果用户传入的是浮点数等非整数值直接int(maxiter)的截断行为可能造成与预期不符的迭代上限甚至引发底层求解器异常。本版本的修复为该参数补充了类型/取值校验保证maxiter必须是合法整数。对调用方而言升级后 SLSQP 会在参数非法时给出清晰报错而不是在求解过程中产生难以定位的异常行为。optimize L-BFGS-B修复不兼容的 dtypePR #23471optimize: fix the incompatible dtypes in L-BFGS-B修复了 L-BFGS-B 中因数据类型dtype不兼容导致的问题。L-BFGS-B 是带边界约束的有限内存 BFGS 拟牛顿法底层是 Fortran 求解器对应仓库中的 scipy/optimize/_lbfgsbmodule.c。当目标函数、梯度或边界数组的 dtype 不一致例如混合 float32 与 float64或整数与浮点数组混用时底层的 Fortran 例程可能读到错误的内存布局。该修复统一了传入底层例程的数组 dtype避免此类边界条件下的未定义行为。线性代数模块scipy.linalgsqrtm 内存泄漏PR #23563 除修复optimize.nnls外同时修复了linalg.sqrtm的内存泄漏。sqrtm计算矩阵平方根实现在 scipy/linalg/_matfuncs.py采用 Schur 分解法算法依据 Deadman、Higham 与 Ralha 的 blocked Schur 算法以及 Higham 1987 的实矩阵平方根论文见其文档字符串 References 一节res, isIllconditioned, isSingular, info recursive_schur_sqrtm(a)入口处还包含完整的输入归一化逻辑整数输入会转成 float64、float16 转 float32、complex64/128 与 float64 保留原精度并拒绝fdFD之外的其他 dtype。值得注意的是sqrtm支持批量batch维度A的末两维必须是方阵。内存泄漏主要出现在 Schur 分解递归求解路径的临时缓冲区管理上本版本修复后频繁调用sqrtm的应用如大规模仿真中的矩阵根运算不再有内存持续增长的隐患。打包与许可合规修复本版本还包含两类容易被忽略但影响面较大的打包改动Qhull 许可证文件缺失Issue #23428 报告自 1.16.0 起wheel 中缺少子组件的许可证条款。PR #23435ensure Qhull license file gets included in wheels确保 Qhull 的许可证文件被纳入 wheel 产物。Qhull 是scipy.spatial中凸包、Delaunay 三角剖分等功能依赖的底层库对应子模块 scipy/spatial/qhull_misc.c 及 subprojects/qhull_r其许可证文件COPYING_QHULL.txt见 scipy/spatial/COPYING_QHULL.txt此前未能随 wheel 发布违反了开源许可证的分发要求。捆绑软件许可更新PR #23452Update licensing of bundled software系统性地更新了所有捆绑子组件的许可声明与上一项共同解决了 Issue #23428 反映的自 1.16.0 起子组件许可条款不完整的问题。对在企业或严格合规环境中分发 SciPy 的用户此修复具有实际意义。构建系统与 CI 基础设施改动1.16.2 的余下改动集中于工程基础设施pytest 下界Issue #22244 提出在 pyproject.toml 中为 pytest 指定下界PR #23495 将其落实为pytest8.0.0。这保证了 SciPy 测试套件在较新的 pytest 版本下行为一致避免因 pytest 老版本 API 差异导致的假性失败。CuPy 升级修复 GPU CIIssue #23458 报告所有 CuPy 测试出现 CUDA 编译失败PR #23488 将 CuPy 升级到 13.6.0 修复了 GPU 上的 CI 流水线。CI 运行器更新Issue #22825 提到 GitHub 新的 CI runnermacOS 15 与 Windows 2025可用相关改动PR #23154 等同步更新了构建矩阵。scikit-umfpack 版本钉扎Issue #23564 报告 macOS conda-forge 任务因 scikit-umfpack 升级而失败PR #23576 将其钉扎到 0.3.30.4.2 存在问题。scikit-umfpack 与 SciPy 的稀疏 LU 分解接口相关参见 scipy/sparse/linalg。meson wraplock 忽略PR #23540 在构建配置中忽略 meson 的 wraplock 文件属于构建系统层面的小清理对应仓库根目录的 meson.options。贡献者名单以下 12 位开发者共同完成了 1.16.2 的发布带号者为首次为 SciPy 贡献补丁Dietrich Brunn (1)Ralf Gommers (6)Adam Jones (1)Gleb Khmyznikov (1) Jost Migenda (1) newyork_loki (1)Nick ODell (3)Dimitri Papadopoulos Orfanos (1)Ilhan Polat (2)Tyler Reddy (26)Mugunthan Selvanayagam (1) Shuhei Watanabe (1) 该名单由版本发布脚本自动生成可能并非完全完整。其中 Tyler Reddy 以 26 次提交承担了本次发布的大部分工作。升级建议综合来看1.16.2 的升级价值集中在三点平台能力Windows on ARM 用户首次获得官方 PyPI wheel可直接pip install scipy1.16.2使用稳定性signal.periodogram、optimize.nnls、linalg.sqrtm三处内存泄漏被修复长期运行或大规模循环调用这些函数的场景收益明显正确性与合规性lombscargle不再原地修改输入数组、SLSQP 对maxiter增加了错误校验、L-BFGS-B 修复 dtype 兼容问题同时 wheel 内的捆绑软件许可证条款恢复完整。由于这是一个纯缺陷修复版本未改变任何公共 API 签名periodogram、nnls、sqrtm、lombscargle等函数的签名与 1.16.x 保持一致可从 scipy/signal/_spectral_py.py、scipy/optimize/_nnls.py、scipy/linalg/_matfuncs.py 直接核对1.16.0/1.16.1 用户可放心平滑升级。升级后可用以下方式确认版本号import scipy print(scipy.__version__) # 1.16.2【免费下载链接】scipySciPy library main repository项目地址: https://gitcode.com/gh_mirrors/sc/scipy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表