我用 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/


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

相关推荐
CDYXY14 小时前
2026年4月成都卡布灯箱源头口碑深度调研与避坑指南
大数据·人工智能
吃好睡好便好19 小时前
用while循环语句求和
开发语言·学习·算法·matlab·信息可视化
小真zzz19 小时前
2026年GEO监测工具深度横评:谁在AI时代守护品牌心智?
人工智能·百度·重构
ZFSS19 小时前
Localization Translate API 集成与使用指南
java·服务器·数据库·人工智能·mysql·ai编程
TechWayfarer19 小时前
查询IP所在地的3种方案:从API到离线库,风控场景怎么选?
开发语言·网络·python·网络协议·tcp/ip
天行健,君子而铎19 小时前
合规对标·低误报漏报·稳定运行——知源-AI数据分类分级系统金融行业解决方案
人工智能·金融·分类
王璐WL19 小时前
【C语言入门级教学】函数的概念2
c语言·数据结构·算法
视觉&物联智能20 小时前
【杂谈】-游戏生成数据:人工智能训练中极易被低估的核心资源
人工智能·游戏·ai·chatgpt·openai·agi·deepseek
程序员榴莲20 小时前
Python 单例模式
开发语言·python·单例模式
扫地的小何尚20 小时前
NVIDIA Vera Rubin 平台如何解决 Agentic AI 的 Scale-up 难题
大数据·人工智能·机器学习