我用 Python 写了个排序库,一亿数据量下比 C 级 np.sort() 快 7 倍

我用 Python 写了个排序库,一亿数据量下比 C 级 np.sort() 快 7 倍

> `pip install beyond-sort`,一行代码,自动选最优排序策略。


先看结果

一亿(100,000,000)个整数排序,32 核 CPU:

| 场景 | np.sort()(C级) | beyond-sort | 加速 |

|------|-----------------|-------------|------|

| 完全随机 | 1731 ms | **1205 ms** | **1.4x** |

| 近乎有序 | 1765 ms | **1090 ms** | **1.6x** |

| 完全逆序 | 1726 ms | **240 ms** | **7.2x** |

| 少量唯一值 | 491 ms | **459 ms** | **1.1x** |

| 管风琴(先升后降) | 1911 ms | **1008 ms** | **1.9x** |

| 锯齿波 | 1584 ms | **932 ms** | **1.7x** |

6 个场景,**全部超越 C 级实现**。

对比 Python 内置 `sorted()`?随机数据快 **16 倍**。


为什么能赢?

`np.sort()` 对所有数据走同一条路------C 级 introsort,不看数据长什么样。

beyond-sort 的核心思路是**先看再排**:

```python

import beyond_sort

result = beyond_sort.sort(data) # 自动选策略

detail = beyond_sort.probe_detail(data) # 查看数据分析结果

```

内部分四层:

第一层:符号层------熵探针

一次扫描,O(n) 时间,同时提取:

  • **有序度 τ**:升序 run 数量 / 总长度

  • **最长升序/降序 run**:判断是否整体有序或逆序

  • **值域范围**:决定能不能用计数排序

这一步相当于给数据做了一次"体检"。

第二层:语法层------Numba JIT

所有核心函数用 `@nb.njit` 编译成 LLVM 原生机器码。不是 Python 解释器在跑,是你 CPU 的原生指令在跑。零解释器开销。

第三层:指令层------向量化

计数排序的直方图用分段并行计数 + 前缀和 + 并行 scatter 实现,每一步都是缓存友好的连续内存访问。

第四层:并行层------值域分桶

这是最关键的设计。不是把数组按位置切成几段分别排------那样排完还要归并。

而是**按值域切**。比如数据范围 0-100 万,切成 16 个桶:0-6.25万、6.25万-12.5万...每个桶的值域不重叠。排完直接拼接,**零归并开销**。

16 个桶分配到多个 CPU 核心并行排序。数据量越大,并行收益越大。


策略路由表

| 数据特征 | 检测方式 | 选择的策略 | 时间复杂度 |

|----------|---------|-----------|----------|

| 完全逆序 | max_desc_run ≥ 90%n | O(n) 翻转 | O(n) |

| 几乎有序 | max_asc_run ≥ 90%n | 局部修复 | O(n + m·k) |

| 值域很小 | value_range ≤ 65536 | 并行计数排序 | O(n + k) |

| 大数据量 | n ≥ 50000 | 并行值域分桶基数排序 | O(n·d / p) |

| 小数据量 | n < 50000 | 单线程 JIT 基数排序 | O(n·d) |

每种数据结构走专属最优路径,不走通用路。


规模越大,优势越大

| 场景 | 10万 | 100万 | 1000万 | 1亿 |

|------|------|-------|--------|-----|

| 随机 | 1.06x | 0.98x | **0.90x** | **0.72x** |

| 逆序 | **0.12x** | **0.15x** | **0.16x** | **0.14x** |

| 管风琴 | **0.22x** | **0.65x** | **0.70x** | **0.52x** |

(x < 1 表示 beyond-sort 更快)

10 万数据量时并行开销占比大,优势不明显。到千万、亿级,并行分桶的物理优势全面释放。


30 秒上手

复制下面这段到你的终端,直接跑,亲眼看结果:

```bash

pip install beyond-sort

```

```python

import beyond_sort

import numpy as np

import time

data = np.random.randint(0, 10_000_000, size=1_000_000, dtype=np.int64)

beyond_sort.warmup() # 首次预热 JIT

np.sort

t0 = time.perf_counter()

r1 = np.sort(data.copy())

t_np = (time.perf_counter() - t0) * 1000

beyond-sort

t0 = time.perf_counter()

r2 = beyond_sort.sort(data)

t_bs = (time.perf_counter() - t0) * 1000

print(f"np.sort: {t_np:.1f} ms")

print(f"beyond-sort: {t_bs:.1f} ms")

print(f"加速: {t_np/t_bs:.1f}x")

print(f"策略: {beyond_sort.probe(data)}")

print(f"结果正确: {np.array_equal(r1, r2)}")

```

依赖:Python 3.10+、NumPy、Numba。都是 pip 自动装的。


适用场景

  • 大规模整数排序(日志时间戳、用户 ID、传感器数据)

  • 数据管道中排序是瓶颈的环节

  • 已知数据有结构特征(近有序、少量唯一值、周期性)

  • 想在不换语言的前提下压榨极致性能

不适用

  • 浮点数排序(当前只支持整数)

  • 数据量 < 1000(内置 sorted 已经够快)

  • 需要自定义比较函数的场景


开源协议

Apache-2.0。可以商用,可以修改,保留署名即可。

**直接安装**: `pip install beyond-sort`

**PyPI 主页**: https://pypi.org/project/beyond-sort/


*"不是算法比别人强,是把三个层打通了。"*

相关推荐
丝瓜蛋汤1 小时前
【腾讯位置服务开发者征文大赛】使用自然语言生成一个低碳出行助手
人工智能·腾讯云位置服务
郝学胜-神的一滴1 小时前
深入理解回归损失函数:MSE、L1 与 Smooth L1 的设计哲学
人工智能·python·程序人生·算法·机器学习·数据挖掘·回归
ZC跨境爬虫1 小时前
Python Django开发者转向微信小程序:从架构理解到第一行代码的完整准备指南
开发语言·python·ui·微信小程序·django
ACP广源盛139246256731 小时前
一芯搞定多屏高清@ACP#GSV1221 DP 1.4 MST 转 HDMI 1.4 高集成转换芯片
网络·人工智能·嵌入式硬件·计算机外设·电脑
绘梨衣5471 小时前
django-elasticsearch-dsl-drf 搜索服务搭建教学文档
python·elasticsearch·django
MClink2 小时前
Trae 自定义模型接入指南:把 DeepSeek、GLM、Qwen 装进你的 AI 编程助手
人工智能·大模型
测试员周周2 小时前
【AI测试系统】第6篇:需求扔进去,3 分钟出测试用例?AI测试系统的 RAG 知识增强实战
人工智能·python·功能测试·测试工具·测试用例
Godspeed Zhao2 小时前
具身智能中的传感器技术40.2——事件相机0.2
人工智能·科技·数码相机·机器学习·事件相机
庞轩px2 小时前
大模型为什么会有“幻觉”——从训练方式到推理局限
人工智能·prompt·rag·大模型幻觉·engineering·训练方式