DEBUG.WIKI
阿里云;从建站到云上业务;云服务器 · 数据库 · 对象存储;查看产品 →
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →

NumPy StringDType 用 heapsort 排序,进程直接段错误退出

特定重复四位字符串在 NumPy 2.5.4 的 quicksort、heapsort 路径中崩溃。可控 argsort 局部选 stable,不把它当成 unique 内部排序开关。

对 StringDType 字符串数组调用 argsort(kind="heapsort"),Python 直接段错误退出;换成稳定排序又能返回。若使用 NumPy 2.5.4,要保留 dtype、字符串长度、重复值和排序算法,不能只把它归为内存不足。

明确的触发输入是两份拼接的、补足四位的数字 ID 字符串,Linux、Python 3.14.8 与 NumPy 2.5.4 的组合中,quicksort 和 heapsort 会崩溃,stable 与 mergesort 没有触发同样故障。这个输入边界不能扩大成“所有重复字符串都会崩溃”,也不能据此改掉 ID 的前导零。

自己控制的排序调用可明确选择 stable

需要得到排序索引时,可以局部选择稳定排序:

import numpy as np

ids = np.array([f"{i:04d}" for i in range(128)] * 2,
               dtype=np.dtypes.StringDType())
order = ids.argsort(kind="stable")
sorted_ids = ids[order]

这是相关输入下已知可用的排序路径,不是对整个 StringDType 实现的修复证明。若同时排列其他列,必须使用同一个 order,不能只排序 ID 后留下错位的业务数据。

稳定排序会保留相等元素的原相对次序。业务此前没有约定平局顺序时,也应确认下游没有无意依赖旧的不稳定顺序,尤其在按排序结果选择第一条记录的流程中。

unique 的内部排序不能靠这行全局改变

同类崩溃也曾从 np.unique(..., return_inverse=True) 的调用中出现,但在别处增加一次 argsort(kind="stable"),不会为 unique 的内部排序设置全局算法。若真实栈来自 unique,先保留返回逆映射的需求和对应关系,再评估包含修复的正式依赖或独立的数据处理方案,不能只把去重前的数组排好就假定问题消失。

段错误通常不会成为可用 try/except 捕获的普通异常,不应在正式任务中反复提交相同崩溃输入。先保留故障栈和环境,再在隔离任务核对稳定排序、原数据与随行字段的配对、重复项次序和缺失值规则。

NumPy 2.5.4 中,仍应对这类输入明确选择可用的排序路径。后续升级先用原数据检查,再决定是否恢复默认算法。StringDType 配置了缺失哨兵时,还需按那个 dtype 的排序约定验收,不能直接套用本例全是普通字符串的前提。