news 2026/11/4 12:17:02

上亿布尔值怎么选:numpy / bitarray / RoaringBitmap / bytearray / scipy.sparse / bool-hybrid-array 正面对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
上亿布尔值怎么选:numpy / bitarray / RoaringBitmap / bytearray / scipy.sparse / bool-hybrid-array 正面对比

先说结论(不藏着)没有"最好的库",只有"最贴你场景的库"。下面这张表先放这,细节后面慢慢唠。| 库 | 单元素存储 | 自动稀疏 | list 语义(append/arr[i]) | 适合 ||—|—|—|—|—|| numpy.bool_ | 1 字节 | ❌ | ✅ | 稠密数值计算 || bitarray | 1 bit | ❌ | ✅(部分) | 稠密位运算 || bytearray | 1 字节 | ❌ | ✅ | 裸字节缓冲 || pyroaring (RoaringBitmap) | 自适应容器 | ✅ | ❌(是集合不是数组) | 倒排索引/集合运算 || scipy.sparse | CSR/CSC | ✅ | ⚠️(API 重) | 科学计算稀疏矩阵 ||bool-hybrid-array| dense 1 bit / sparse 仅索引 | ✅ 自动切换 | ✅ | 上亿级稀疏布尔标记 |## 我是怎么一个个试过来的### 1. numpy.bool_:写着最爽,稀疏起来最惨pythonimport numpy as npa = np.zeros(10_000_000, dtype=bool)a[12345] = True1 亿个布尔值就是 100MB(每元素 1 字节)。你只 set 了 100 个 True,剩下 99.99999% 都是False——那 99.99999% 的空间是纯白交。稠密场景它无敌,和向量化 NumPy 生态无缝;但稀疏就是它的短板。### 2. bitarray:位压得很紧,但不会帮你换挡pythonfrom bitarray import bitarrayb = bitarray(10_000_000)b.setall(False)b[12345] = True每元素 1 bit,1 亿布尔 ≈ 12.5MB,C 扩展跑得飞快。问题是:你哪怕 99.99999% 都是 False,它还是老老实实把 12.5MB 全占满。它不会自动检测稀疏、不会只存异常索引。你想要稀疏,得自己再套一层。### 3. bytearray:就是个字节缓冲每元素 1 字节,和 numpy 一样胖,但没有向量化。基本只在你需要裸字节 I/O 的时候用,做布尔标记属于拿错工具。### 4. pyroaring(RoaringBitmap):工业级,但它是"集合"不是"数组"Roaring 是倒排索引界的老大哥,按高 16 位分容器,ArrayContainer/BitmapContainer/RunContainer 自适应切换,压缩比和查询速度都是顶级。但它的心智模型是集合:add(12345)、contains(12345)、&、|——你问它"第 12345 位是什么"它能答,但你要arr[i] = value这种 list 式按下标赋值、append()、切片,它没这个语义。你要做的是"标记第 N 个用户有没有签到"这种按下标随机访问的数组,Roaring 不是为这个设计的。### 5. scipy.sparse:科学计算的重炮CSR/CSC 矩阵能表达稀疏,但对"布尔向量"这个单一需求来说,API 重量过大——构造矩阵、存行索引列索引、算矩阵乘法,你只是想存几个 True 的位置而已,杀鸡用牛刀。### 6. bool-hybrid-array:把"密集还是稀疏"这件事自动化pythonfrom bool_hybrid_array import BoolHybridArr, TruesArray, FalsesArrayarr = BoolHybridArr([True, False, True, False, True])print(arr[1:4]) # 切片仍是 BoolHybridArray 类型,内容 [False, True, False]full = TruesArray(3) # 全 Trueempty = FalsesArray(3) # 全 False它的逻辑是这样:-密集态:内部np.zeros(ceil(N/8), uint8)+ ctypes,和 numpy 位图一样紧凑;-稀疏态:内部array.array('I')存 True 的升序索引,bisect二分定位,没有 RLE;-全 True / 全 False:直接走"极性塌缩",连数据都不存;- 密度上来了自己切回密集态,对上层透明。API 长得像 list:arr[i]、切片、append、位运算& | ^ ~都有。硬依赖numpy>=1.19,不需要额外 C 编译。## 真要选的时候,怎么拍板你的数据长这样 → 选它:- 1 亿个布尔值,99% 都是 False,但你要按下标arr[user_id]随机读写 →bool-hybrid-array- 1 亿个布尔值,密度 50% 以上,要大量位运算 →bitarray- 只是做集合交集/并集(倒排索引那种) →pyroaring- 本来就在 NumPy 科学计算流水线上 →numpy.bool_- 真的是稀疏矩阵做线性代数 →scipy.sparse我自己做用户签到/打卡/在线状态这类场景,数据量上亿、True 占比通常 <1%,bool-hybrid-array 的 dense/sparse 自动切换就是给这种场景准备的——你不用自己判断"现在该用位图还是该用索引列表",库帮你切。## 几个常见误区(别被网上帖子带偏)1.“它是 Roaring 的竞品”——不是。Roaring 是集合,BHA 是数组,语义不同,解决的问题有交集但不重叠。2.“它带 RLE 压缩”——不带。稀疏侧就是升序索引 + bisect,简单直接。3.“全 True 也要占空间”——不会,极性塌缩,一个标志位搞定。4.“版本很老”——当前 PyPI 是 9.13.11,许可证 Apache-2.0 OR MulanPSL-2.0 双许可,作者蔡靖杰。## 收尾选型这事儿,最怕的不是选错,是用集合语义的库去干数组的活,或者用稠密库硬撑稀疏数据。把上面那张表对着你的真实数据密度和访问方式看一眼,基本就不会走偏。上亿级稀疏布尔标记这种场景,你拿 numpy 硬上,内存先炸;拿 Roaring 硬上,list 语义对不上;拿 bitarray 硬上,稀疏态不会帮你换挡。bool-hybrid-array 就是在这堆组合缝里长出来的一个专门方案——不神,但对路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 12:15:32

记录学习c语言第一天——数组和函数

C语言学习记录&#xff08;一&#xff09;&#xff1a;从数组到指针入门初学者视角的完整笔记&#xff1a;知识点整理 代码示例 踩坑复盘 后续计划。前言最近在系统学习 C 语言&#xff0c;今天集中攻克了「数组 → 字符串 → 二维数组 → 函数 → 指针入门」这一串内容。作…

作者头像 李华
网站建设 2026/11/4 12:15:25

一个 authorized_keys 字段,解决了多 Agent 系统的身份问题

一个 authorized_keys 字段&#xff0c;解决了多 Agent 系统的身份问题 多智能体源码协作系列 第 2 篇 / 共 8 篇 上一篇&#xff08;第 1 篇 问题定义&#xff09;&#xff1a;CSDN 本文所有路径、席位名、项目名均为泛化示例&#xff0c;可直接复制使用。 一、结论先行 在…

作者头像 李华
网站建设 2026/11/4 12:15:09

真绝了,国产模型 Token 自由了!

大家好&#xff0c;我是二哥呀。 前几天我不是去大学讲课了嘛&#xff0c;问了很多同学&#xff0c;都说顶级模型太贵了&#xff0c;根本用不起&#xff0c;他们想要更多的赛博鸡蛋。 这不&#xff0c;正巧赶上 1024 开发者节&#xff0c;讯飞发布了全新的星火 X2.6&#xff08…

作者头像 李华
网站建设 2026/11/4 12:14:39

emacs 文件管理Dired, the Directory Editor

Dired&#xff1a;目录编辑器 Dired 会创建一个 Emacs Buffer&#xff0c;其中包含某个目录的文件列表&#xff0c;并且还可以选择性地包含该目录下的一些子目录的内容。 你可以使用 Emacs 的常规命令在这个 Buffer 中移动和浏览&#xff0c;也可以使用 Dired 专用命令对列表中…

作者头像 李华
网站建设 2026/11/4 12:13:39

Kestrel_VLLM - 30 · MTP 头适配:十五个张量与一个不存在的 oracle

30 MTP 头适配&#xff1a;十五个张量与一个不存在的 oracle 一句话&#xff1a;Qwen3.5-27B 除 64 层主干外还自带一个模型内投机草稿头 MTP&#xff08;Multi-Token Prediction&#xff0c;多 token 预测&#xff09;——它不在主干里、没有官方实现可对照&#xff0c;却决定…

作者头像 李华