bool-hybrid-array 9.6.0__tar.gz → 9.11.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bool_hybrid_array-9.11.10/PKG-INFO +648 -0
- bool_hybrid_array-9.11.10/README.md +603 -0
- bool_hybrid_array-9.11.10/bool_hybrid_array/__init__.py +30 -0
- bool_hybrid_array-9.11.10/bool_hybrid_array/__main__.py +309 -0
- bool_hybrid_array-9.11.10/bool_hybrid_array/_cppiostream.py +216 -0
- bool_hybrid_array-9.11.10/bool_hybrid_array/compile_core.pyd +0 -0
- bool_hybrid_array-9.11.10/bool_hybrid_array/core.c +67180 -0
- {bool_hybrid_array-9.6.0 → bool_hybrid_array-9.11.10}/bool_hybrid_array/core.py +969 -612
- bool_hybrid_array-9.11.10/bool_hybrid_array/int_array/__init__.py +4 -0
- bool_hybrid_array-9.11.10/bool_hybrid_array/int_array/core.py +154 -0
- bool_hybrid_array-9.11.10/bool_hybrid_array//347/247/230/345/257/206.md +2 -0
- bool_hybrid_array-9.11.10/bool_hybrid_array.egg-info/PKG-INFO +648 -0
- bool_hybrid_array-9.11.10/bool_hybrid_array.egg-info/SOURCES.txt +17 -0
- bool_hybrid_array-9.11.10/bool_hybrid_array.egg-info/requires.txt +6 -0
- bool_hybrid_array-9.11.10/setup.py +49 -0
- bool_hybrid_array-9.6.0/PKG-INFO +0 -416
- bool_hybrid_array-9.6.0/README.md +0 -391
- bool_hybrid_array-9.6.0/bool_hybrid_array/__init__.py +0 -16
- bool_hybrid_array-9.6.0/bool_hybrid_array.egg-info/PKG-INFO +0 -416
- bool_hybrid_array-9.6.0/bool_hybrid_array.egg-info/SOURCES.txt +0 -10
- bool_hybrid_array-9.6.0/bool_hybrid_array.egg-info/requires.txt +0 -1
- bool_hybrid_array-9.6.0/setup.py +0 -28
- {bool_hybrid_array-9.6.0 → bool_hybrid_array-9.11.10}/LICENSE +0 -0
- {bool_hybrid_array-9.6.0 → bool_hybrid_array-9.11.10}/bool_hybrid_array.egg-info/dependency_links.txt +0 -0
- {bool_hybrid_array-9.6.0 → bool_hybrid_array-9.11.10}/bool_hybrid_array.egg-info/top_level.txt +0 -0
- {bool_hybrid_array-9.6.0 → bool_hybrid_array-9.11.10}/setup.cfg +0 -0
|
@@ -0,0 +1,648 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: bool-hybrid-array
|
|
3
|
+
Version: 9.11.10
|
|
4
|
+
Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
|
|
5
|
+
Home-page: https://github.com/BKsell/bool-hybrid-array
|
|
6
|
+
Author: 蔡靖杰
|
|
7
|
+
Author-email: 1289270215@qq.com
|
|
8
|
+
Project-URL: GitHub 主站, https://github.com/BKsell/bool-hybrid-array
|
|
9
|
+
Project-URL: GitHub 中文镜像, https://www.github-zh.com/projects/1083175506-bool-hybrid-array
|
|
10
|
+
Project-URL: Issue 反馈(主站), https://github.com/BKsell/bool-hybrid-array/issues
|
|
11
|
+
Keywords: boolean array,compact storage
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
21
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
22
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
23
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
24
|
+
Classifier: Operating System :: OS Independent
|
|
25
|
+
Requires-Python: >=3.8
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Requires-Dist: numpy>=1.19.0
|
|
29
|
+
Provides-Extra: int-array
|
|
30
|
+
Provides-Extra: numba-opt
|
|
31
|
+
Requires-Dist: numba>=0.55.0; extra == "numba-opt"
|
|
32
|
+
Dynamic: author
|
|
33
|
+
Dynamic: author-email
|
|
34
|
+
Dynamic: classifier
|
|
35
|
+
Dynamic: description
|
|
36
|
+
Dynamic: description-content-type
|
|
37
|
+
Dynamic: home-page
|
|
38
|
+
Dynamic: keywords
|
|
39
|
+
Dynamic: license-file
|
|
40
|
+
Dynamic: project-url
|
|
41
|
+
Dynamic: provides-extra
|
|
42
|
+
Dynamic: requires-dist
|
|
43
|
+
Dynamic: requires-python
|
|
44
|
+
Dynamic: summary
|
|
45
|
+
|
|
46
|
+
# BoolHybridArray:高效的布尔混合数组库
|
|
47
|
+
|
|
48
|
+
<!-- 月下载量(核心推荐)+ 周下载量 + 总下载量 -->
|
|
49
|
+
[](https://pepy.tech/project/bool-hybrid-array)
|
|
50
|
+
[](https://pepy.tech/project/bool-hybrid-array)
|
|
51
|
+
[](https://pepy.tech/project/bool-hybrid-array)
|
|
52
|
+
|
|
53
|
+
一个专为布尔值优化的数组类,能够根据数据特征自动在密集存储和稀疏存储模式间切换,兼顾性能和内存效率。
|
|
54
|
+
|
|
55
|
+
## ***注:大版本号更新并非不兼容更新,而是重大更新***
|
|
56
|
+
|
|
57
|
+
注:当API完全稳定时就会发布版本规则较严谨的new-1.0.0版本,预期为10.x版本结束后
|
|
58
|
+
|
|
59
|
+
***注意:目前社区中若存在名称类似(如包含 “bool-hybrid-array”+ 后缀、boolean\_array、validate.io-boolean-array)的库,均与本项目(bool-hybrid-array)无关联,本项目的所有功能设计、代码实现均为独立开发;***
|
|
60
|
+
***其他平台里的类似名库绝不是我的库***
|
|
61
|
+
|
|
62
|
+
***注意:若你的原bool-hybrid-array库版本<7.10.9,看到此版本请立即更新到>=7.10.9版本,其他版本的导入都有问题!!!***
|
|
63
|
+
|
|
64
|
+
作者:蔡靖杰(同维护者,PyPI账号Bkshell)
|
|
65
|
+
|
|
66
|
+
## 安装方法
|
|
67
|
+
|
|
68
|
+
使用pip安装:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
|
|
72
|
+
pip install bool-hybrid-array
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 更新方法
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
|
|
80
|
+
pip install -U bool-hybrid-array
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 核心特性
|
|
85
|
+
|
|
86
|
+
* **智能存储模式**:数据量小的位置使用密集存储numpy.ndarray数组,
|
|
87
|
+
* 数据量大的位置为稀疏存储array.array稀疏数组
|
|
88
|
+
* 非稀疏模式:数据大部分为非0(True)索引
|
|
89
|
+
* 稀疏模式:数据大部分为0(False)索引
|
|
90
|
+
* BoolHybridArr函数会自动切换
|
|
91
|
+
* **内存高效**:稀疏数据场景下比普通列表节省50%-80%内存
|
|
92
|
+
* **操作便捷**:支持类似列表的索引、切片和赋值操作
|
|
93
|
+
* **快速统计**:内置高效的计数和布尔判断方法
|
|
94
|
+
* **速度优势**:修改元素的时间还不比list慢
|
|
95
|
+
|
|
96
|
+
## 快速开始
|
|
97
|
+
|
|
98
|
+
### 基本用法
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
|
|
102
|
+
# 导入类
|
|
103
|
+
|
|
104
|
+
from bool_hybrid_array import *
|
|
105
|
+
|
|
106
|
+
# 创建实例
|
|
107
|
+
|
|
108
|
+
arr = BoolHybridArr([True, False, True, False, True])
|
|
109
|
+
|
|
110
|
+
arr2 = TruesArray(3)#7.9.0新增
|
|
111
|
+
|
|
112
|
+
arr3 = FalsesArray(3)#7.9.0新增
|
|
113
|
+
|
|
114
|
+
# 访问元素
|
|
115
|
+
|
|
116
|
+
print(arr[0]) # 输出: True;
|
|
117
|
+
|
|
118
|
+
print(arr[1:4]) # 输出: BoolHybridArr([False, True, False]);
|
|
119
|
+
|
|
120
|
+
print(arr2) # 输出: BoolHybridArr([True, True, True]);
|
|
121
|
+
|
|
122
|
+
print(arr3) # 输出: BoolHybridArr([False, False, False]);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
# 联系方式
|
|
126
|
+
|
|
127
|
+
* 若遇到 Bug 或有功能建议,可发送邮件至:1289270215@qq.com(更正规)
|
|
128
|
+
* 微信联系:18250730129(注:这是微信绑定的电话号码,优先微信沟通,请勿拨打电话哦)(微信联系回复最快)
|
|
129
|
+
* 抖音(绑定的电话号码同微信)(有讨论群,加入可讨论)
|
|
130
|
+
|
|
131
|
+
# GitHub仓库
|
|
132
|
+
|
|
133
|
+
英文版:[bool-hybrid-array.git](https://github.com/BKsell/bool-hybrid-array.git)
|
|
134
|
+
中文版:[1083175506-bool-hybrid-array](https://www.github-zh.com/projects/1083175506-bool-hybrid-array)
|
|
135
|
+
|
|
136
|
+
# 修改元素
|
|
137
|
+
|
|
138
|
+
```python
|
|
139
|
+
|
|
140
|
+
arr[2] = False
|
|
141
|
+
|
|
142
|
+
print(arr) # 输出: BoolHybridArr([True, False, False, False, True])
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 存储优化
|
|
147
|
+
|
|
148
|
+
```python
|
|
149
|
+
|
|
150
|
+
# 创建包含大量布尔值的数组(大部分为False)
|
|
151
|
+
|
|
152
|
+
big_arr = BoolHybridArr([i % 100 == 0 for i in range(10000)])
|
|
153
|
+
|
|
154
|
+
# 查看存储模式(此时应为稀疏模式)
|
|
155
|
+
|
|
156
|
+
print(repr(big_arr)) # 输出: BoolHybridArray(split_index=100, size=10000, is_sparse=True, small_len=101, large_len=98)
|
|
157
|
+
|
|
158
|
+
# 自动优化存储
|
|
159
|
+
|
|
160
|
+
big_arr.optimize()
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 其他功能
|
|
165
|
+
|
|
166
|
+
```python
|
|
167
|
+
|
|
168
|
+
# 统计True的数量
|
|
169
|
+
|
|
170
|
+
print(arr.count(True)) # 输出: 2
|
|
171
|
+
|
|
172
|
+
# 检查是否至少有一个True
|
|
173
|
+
|
|
174
|
+
print(any(arr)) # 输出: True
|
|
175
|
+
|
|
176
|
+
# 检查是否全为True
|
|
177
|
+
|
|
178
|
+
print(all(arr)) # 输出: False
|
|
179
|
+
|
|
180
|
+
# 复制数组(7.9.1新增)
|
|
181
|
+
|
|
182
|
+
arr_copy = arr.copy()
|
|
183
|
+
|
|
184
|
+
arr_copy[0] = False
|
|
185
|
+
|
|
186
|
+
print(arr[0]) # 输出: True(原数组不变)
|
|
187
|
+
|
|
188
|
+
print(arr_copy[0]) # 输出: False(拷贝数组已修改)
|
|
189
|
+
|
|
190
|
+
#寻找一个元素出现的索引(7.9.2新增)
|
|
191
|
+
|
|
192
|
+
arr_find = BoolHybridArr([i % 2 for i in range(10)])
|
|
193
|
+
|
|
194
|
+
print(arr_find.find(True))#输出:[1,3,5,7,9]
|
|
195
|
+
|
|
196
|
+
print(arr_find.find(False))#输出:[2,4,6,8,10]
|
|
197
|
+
|
|
198
|
+
# 查找第一个/最后一个出现的位置(7.10.3新增)
|
|
199
|
+
|
|
200
|
+
print(arr_find.index(True)) # 输出:1(第一个True的位置)
|
|
201
|
+
|
|
202
|
+
print(arr_find.rindex(True)) # 输出:9(最后一个True的位置)
|
|
203
|
+
|
|
204
|
+
#index/rindex的空数组处理(7.10.4新增)
|
|
205
|
+
|
|
206
|
+
none_arr = BoolHybridArr([])
|
|
207
|
+
|
|
208
|
+
print(none_arr.index(True))#ValueError:无法在空的 BoolHybridArray 中查找元素
|
|
209
|
+
|
|
210
|
+
#查看是否需要优化(7.10.7新增,7.10.20+能用)
|
|
211
|
+
|
|
212
|
+
print(big_arr.memory_usage(detail=True))
|
|
213
|
+
'''样例输出(瞎编,但格式是这样)
|
|
214
|
+
{
|
|
215
|
+
"总占用(字节)": 210,
|
|
216
|
+
"密集区占用": 180,
|
|
217
|
+
"稀疏区占用": 30,
|
|
218
|
+
"对比原生list节省": "99.5%",
|
|
219
|
+
"对比numpy节省": "79.0%",
|
|
220
|
+
"是否需要优化": "是",
|
|
221
|
+
"优化理由/说明": "稀疏区索引密度过高,优化后可转为密集存储提升速度"
|
|
222
|
+
}
|
|
223
|
+
'''
|
|
224
|
+
big_arr.optimize() # 调用优化方法
|
|
225
|
+
|
|
226
|
+
print(big_arr.memory_usage(detail=True)["是否需要优化"])#"否"
|
|
227
|
+
|
|
228
|
+
'''当处理动态变化的布尔数组(如频繁增删元素)时,建议在关键操作后调用memory\_usage(detail=True)检查状态,通过optimize()保持最优性能。'''
|
|
229
|
+
|
|
230
|
+
#将数组转为int类型(7.11.0新增):
|
|
231
|
+
|
|
232
|
+
print(int(arr))#输出:17(0b10001)
|
|
233
|
+
|
|
234
|
+
#位运算(7.13.0新增)
|
|
235
|
+
|
|
236
|
+
arr1 = BoolHybridArr([True, False, True, False]) # 0b1010
|
|
237
|
+
|
|
238
|
+
arr2 = BoolHybridArr([True, True, False, False]) # 0b1100
|
|
239
|
+
|
|
240
|
+
print(arr1 & arr2) # 输出:BoolHybridArr([True,False,False,False]) # 0b1000
|
|
241
|
+
|
|
242
|
+
print(arr1 | arr2) # 输出:BoolHybridArr([True,True,True,False]) # 0b1110
|
|
243
|
+
|
|
244
|
+
print([True, False] | arr1[:2]) # 反向运算:[True,False] | [True,False] → [True,False]
|
|
245
|
+
|
|
246
|
+
print(arr1 ^ arr2) # 输出:BoolHybridArr([False,True,True,False]) # 0b0110
|
|
247
|
+
|
|
248
|
+
print(~arr1) # 输出:BoolHybridArr([False,True,False,True]) # 0b0101(对应整数 ~10 = -11 的二进制布尔逻辑)
|
|
249
|
+
|
|
250
|
+
arr = BoolHybridArr([True, False, True]) # 0b101
|
|
251
|
+
|
|
252
|
+
arr <<= 2 # 左移2位:尾部补2个False → [True,False,True,False,False](0b10100)
|
|
253
|
+
|
|
254
|
+
print(arr)
|
|
255
|
+
|
|
256
|
+
arr >>= 3 # 右移3位:尾部删3个元素 → [True,False](0b10)
|
|
257
|
+
|
|
258
|
+
print(arr)
|
|
259
|
+
|
|
260
|
+
print(arr << -1) # 负数左移:等价于右移1位 → [True]
|
|
261
|
+
|
|
262
|
+
#兼容numpy数组(8.0.0版本新增)
|
|
263
|
+
|
|
264
|
+
arr_BoolHybridArray = BoolHybridArr(\[])
|
|
265
|
+
arr_BoolHybridArray <<= 10
|
|
266
|
+
arr_BoolHybridArray <<= 10000
|
|
267
|
+
array_numpy = np.array([arr_BoolHybridArray,arr_BoolHybridArray])
|
|
268
|
+
|
|
269
|
+
#支持哈希(8.2.0版本新增)
|
|
270
|
+
|
|
271
|
+
set_ = {arr_BoolHybridArray}#不会报错呦
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
# ***v9.0.0重大更新***
|
|
276
|
+
|
|
277
|
+
```python
|
|
278
|
+
import numpy as np
|
|
279
|
+
import bool_hybrid_array
|
|
280
|
+
|
|
281
|
+
_2darr = BHA_List([BoolHybridArr([1,0,0,0,1],Type = BHA_Bool),TruesArray(5,Type = bool),FalsesArray(5,Type = np.bool_)])
|
|
282
|
+
|
|
283
|
+
print(_2darr)'''输出:
|
|
284
|
+
|
|
285
|
+
BHA_List([
|
|
286
|
+
BoolHybridArr([True,False,False,False,True]),
|
|
287
|
+
BoolHybridArr([True,True,True,True,True]),
|
|
288
|
+
BoolHybridArr([False,False,False,False,False]),
|
|
289
|
+
])
|
|
290
|
+
'''
|
|
291
|
+
|
|
292
|
+
#BoolHybridArray是布尔数组,那是什么布尔数组呢?numpy.bool_?原生bool?其他库的布尔类型?还是本库的BHA_Bool?Type参数,支持指定!
|
|
293
|
+
|
|
294
|
+
#还更新了用BHA_List的排版模拟二维布尔数组!
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
# 其他
|
|
300
|
+
|
|
301
|
+
```python
|
|
302
|
+
|
|
303
|
+
#二维数组的optimize与memory_usage(9.1.0新增):
|
|
304
|
+
|
|
305
|
+
_2darr.optimize()
|
|
306
|
+
|
|
307
|
+
_2darr.memory_usage(detail=T)
|
|
308
|
+
|
|
309
|
+
输出格式:
|
|
310
|
+
{
|
|
311
|
+
"占用(字节)": 【占用内存(字节)】,
|
|
312
|
+
"对比原生list节省": 【6位百分比】,
|
|
313
|
+
"对比numpy节省": 【6位百分比】}
|
|
314
|
+
|
|
315
|
+
#注:BoolHybridArray的memory_usage的百分比也变成了六位小数
|
|
316
|
+
|
|
317
|
+
#关闭哈希复用(9.4.0新增)
|
|
318
|
+
|
|
319
|
+
_2darr2 = BHA_List(BoolHybridArr((i%100 for i in range(1000)),hash_ = F) for i in range(1000))
|
|
320
|
+
|
|
321
|
+
#关闭哈希复用可以增快创建速度
|
|
322
|
+
|
|
323
|
+
#ResurrectMeta元类(9.5.0新增)
|
|
324
|
+
|
|
325
|
+
class MyClass(metaclass=ResurrectMeta):
|
|
326
|
+
pass
|
|
327
|
+
|
|
328
|
+
#用装饰器给实例添加动态方法(9.6.0新增):
|
|
329
|
+
|
|
330
|
+
arr = BoolHybridArr([T,F,T])
|
|
331
|
+
|
|
332
|
+
@arr
|
|
333
|
+
def toggle_range(self, start: int, end: int):
|
|
334
|
+
"""翻转从 start 到 end(含)的布尔值"""
|
|
335
|
+
for i in range(start, end + 1):
|
|
336
|
+
self[i] = not self[i] # 通过 self 操作实例的元素
|
|
337
|
+
print(f"翻转 {start}-{end} 后:", self)
|
|
338
|
+
|
|
339
|
+
arr.toggle_range(0,1)
|
|
340
|
+
|
|
341
|
+
print(arr)#输出:翻转 {0}-{1} 后:BoolHybridArr([False,True,True])
|
|
342
|
+
|
|
343
|
+
toggle_range(arr,0,1)#输出:翻转 {0}-{1} 后:BoolHybridArr([True,False,True])
|
|
344
|
+
|
|
345
|
+
#view方法(9.7.0新增):
|
|
346
|
+
|
|
347
|
+
arr2 = arr.view()
|
|
348
|
+
|
|
349
|
+
arr2.extend([F,T])
|
|
350
|
+
|
|
351
|
+
arr2[2] = F
|
|
352
|
+
|
|
353
|
+
print(arr) #输出:BoolHybridArr([True,False,False,False,True])
|
|
354
|
+
|
|
355
|
+
#python 3.9以下的版本泛型、联合类型支持(9.8.0新增)
|
|
356
|
+
|
|
357
|
+
print(BHA_List[BoolHybridArray])#输出:bool_hybrid_array.BHA_List[bool_hybrid_array.BoolHybridArray]
|
|
358
|
+
|
|
359
|
+
print(BHA_List|BoolHybridArray)#输出:typing.Union[bool_hybrid_array.BHA_List, bool_hybrid_array.BoolHybridArray] (python 3.9以下)或 bool_hybrid_array.BHA_List|bool_hybrid_array.BoolHybridArray(python 3.10以上)
|
|
360
|
+
|
|
361
|
+
#BHA_Function动态创建函数(9.9.0新增):
|
|
362
|
+
|
|
363
|
+
toggle_range = BHA_Function.string_define(
|
|
364
|
+
name = 'toggle_range',
|
|
365
|
+
text =
|
|
366
|
+
'''
|
|
367
|
+
for i in range(start, end + 1):
|
|
368
|
+
self[i] = not self[i] # 通过 self 操作实例的元素
|
|
369
|
+
print(f"翻转 {start}-{end} 后:", self)''',
|
|
370
|
+
positional = ('self','start', 'end'),
|
|
371
|
+
default = {})
|
|
372
|
+
toggle_range([0,0,1],0,1)#输出:翻转 0-1 后: [True, True, 1]
|
|
373
|
+
|
|
374
|
+
#开放ProtectedBuiltinsDict类型(9.9.3+)
|
|
375
|
+
|
|
376
|
+
Dict = ProtectedBuiltinsDict({'1':1,'2':2},protected_names = ['1','3'],name = 'Dict')
|
|
377
|
+
|
|
378
|
+
Dict['2'] = 1
|
|
379
|
+
|
|
380
|
+
print(Dict) #输出:{'1': 1, '2': 1}
|
|
381
|
+
|
|
382
|
+
try:Dict['1'] = 2
|
|
383
|
+
except Exception as e:print(e) #输出:禁止修改内置常量:__Dict__['1']
|
|
384
|
+
|
|
385
|
+
#Ask_BHA和Create_BHA(9.10.0新增):
|
|
386
|
+
|
|
387
|
+
arr = BoolHybridArr([T,F,F,F,T,T,F,F,F,T])
|
|
388
|
+
arr2 = BoolHybridArr([F,F,F,F,T,T,F,T,T,F])
|
|
389
|
+
|
|
390
|
+
arr3 = BHA_List([arr,arr2])
|
|
391
|
+
|
|
392
|
+
Create_BHA("single_bool_array",arr3)#自动生成single_bool_array.bha文件
|
|
393
|
+
|
|
394
|
+
print(Ask_BHA("single_bool_array"))
|
|
395
|
+
|
|
396
|
+
'''
|
|
397
|
+
输出:
|
|
398
|
+
BHA_List([
|
|
399
|
+
BoolHybridArr([True,False,False,False,True,True,False,False,False,True]),
|
|
400
|
+
BoolHybridArr([False,False,False,False,True,True,False,True,True,False]),
|
|
401
|
+
])
|
|
402
|
+
'''
|
|
403
|
+
|
|
404
|
+
#numba_opt函数优化(9.10.4版本新增)
|
|
405
|
+
try:numba_opt()
|
|
406
|
+
except:print("请先安装numba库!!!")
|
|
407
|
+
|
|
408
|
+
#int_array模块(9.10.10新增):
|
|
409
|
+
|
|
410
|
+
max_num = (1 << 256) - 1
|
|
411
|
+
min_num = -max_num
|
|
412
|
+
|
|
413
|
+
# 1. IntHybridArray:257位完美存储
|
|
414
|
+
arr_hybrid = int_array.IntHybridArray([max_num, min_num, 123456], bit_length=257)
|
|
415
|
+
print("✅ IntHybridArray存储结果:")
|
|
416
|
+
print(f"最大值:{arr_hybrid[0]}")
|
|
417
|
+
print(f"最小值:{arr_hybrid[1]}")
|
|
418
|
+
|
|
419
|
+
# 2. NumPy:用最大的int64尝试存储(必然失败)
|
|
420
|
+
try:
|
|
421
|
+
arr_np = np.array([max_num, min_num, 123456], dtype=np.int64)
|
|
422
|
+
print("\n❌ NumPy存储结果:", arr_np)
|
|
423
|
+
except OverflowError as e:
|
|
424
|
+
print(f"\n❌ NumPy存储失败:{e}")
|
|
425
|
+
|
|
426
|
+
#BHA_Queue(9.11.5版本新增)
|
|
427
|
+
|
|
428
|
+
q = BHA_Queue([T, F, T, T, F])
|
|
429
|
+
|
|
430
|
+
print(f"初始化队列: {q}") # 输出:BHA_Queue([T,F,T,T,F])
|
|
431
|
+
|
|
432
|
+
q.enqueue(T)
|
|
433
|
+
|
|
434
|
+
q.enqueue(F)
|
|
435
|
+
|
|
436
|
+
print(f"入队2个元素后: {q}") # 输出:BHA_Queue([T,F,T,T,F,T,F])
|
|
437
|
+
|
|
438
|
+
# 3. 出队(dequeue,均摊O(1),仅首次触发转移)
|
|
439
|
+
|
|
440
|
+
print(f"第一次出队: {q.dequeue()}") # 输出:T(触发 self.a → self.b 转移,仅1次)
|
|
441
|
+
|
|
442
|
+
print(f"第二次出队: {q.dequeue()}") # 输出:F(直接从 self.b 弹出,纯O(1))
|
|
443
|
+
|
|
444
|
+
print(f"出队2个元素后: {q}") # 输出:BHA_Queue([T,T,F,T,F])
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
## 性能优势
|
|
450
|
+
|
|
451
|
+
在包含100万个布尔值且只有10%为True的场景下
|
|
452
|
+
或在包含100万个布尔值且只有10%为False的场景下:
|
|
453
|
+
|
|
454
|
+
* ###### 普通Python列表:约占用1MB内存
|
|
455
|
+
* BoolHybridArray:约占用100KB内存(节省90%)
|
|
456
|
+
* 随机访问速度基本保持一致
|
|
457
|
+
|
|
458
|
+
## 版本历史
|
|
459
|
+
|
|
460
|
+
- **7.8.13**:PyPI上的初始版本,支持基本功能和自动存储优化
|
|
461
|
+
* **7.9.0**:添加TruesArray和FalsesArray
|
|
462
|
+
* **7.9.1**:修复介绍的bug,增加copy功能
|
|
463
|
+
* **7.9.2**:新增find()方法
|
|
464
|
+
* **7.10.0**:优化内部存储,重构密集部分(但使用还是一样)
|
|
465
|
+
* **7.10.1**:与运算和或运算增加异常提醒
|
|
466
|
+
* **7.10.2**:修复了之前所有版本的index错误
|
|
467
|
+
* **7.10.3**:新增rindex
|
|
468
|
+
* **7.10.4**:修正样例代码中的错误,增加index/rindex的空数组处理
|
|
469
|
+
* **7.10.5**:修复7.10.4版本index/rindex中size没加self的错误
|
|
470
|
+
* **7.10.6**:比7.10.0进一步优化内部储存
|
|
471
|
+
* **7.10.7**:新增arr.memory·_usage方法查看是否优化,支持查看内存占用详情及优化建议,配合arr.optimize()实现存储自动调优
|
|
472
|
+
* **7.10.8**:增加cython加速
|
|
473
|
+
* **7.10.9**:修复之前所有版本的导入问题
|
|
474
|
+
* **7.10.10**:修复unit8溢出问题
|
|
475
|
+
* **7.10.11**:尝试修复memory_usage方法的错误
|
|
476
|
+
* **7.10.12**:尝试修复memory_usage方法的错误×2
|
|
477
|
+
* **7.10.13**:尝试修复memory_usage方法的错误×3
|
|
478
|
+
* **7.10.14**:尝试修复unit8溢出问题×2
|
|
479
|
+
* **7.10.15**:尝试修复unit8溢出问题×3
|
|
480
|
+
* **7.10.16**:修复unit8溢出问题×4+尝试修复memory\_usage方法的错误×4
|
|
481
|
+
* **7.10.17**:尝试修复memory_usage方法的错误×4
|
|
482
|
+
* **7.10.18**:尝试修复memory_usage方法的错误×5
|
|
483
|
+
* **7.10.19**:尝试修复memory_usage方法的错误×6
|
|
484
|
+
* **7.10.20**:尝试修复memory_usage方法的错误×7
|
|
485
|
+
* **7.11.0**:新增int功能,把布尔数组转为int类型
|
|
486
|
+
* **7.12.0**:在优化函数中新增应对超级稀疏/超级密集情况的方案
|
|
487
|
+
* **7.13.0**:新增多种位运算功能
|
|
488
|
+
* **7.13.1**:修复普通左移参数为负数时结果错误
|
|
489
|
+
* **7.13.2**:修复左移时的sqrt问题,优化左移
|
|
490
|
+
* **7.13.3**:修复左移的问题
|
|
491
|
+
* **7.13.4**:优化左移
|
|
492
|
+
* **7.13.5**:优化sqrt
|
|
493
|
+
* **7.13.6**:修复7.13.5版本的SyntaxError
|
|
494
|
+
* **7.13.7**:优化__int__方法
|
|
495
|
+
* **7.14.0**:优化密集部分的运算速度
|
|
496
|
+
* **7.14.1**:优化多种位运算方法
|
|
497
|
+
* **7.14.2**:修复7.14.1版本的in的错误
|
|
498
|
+
* **7.14.3**:修复in的错误×2
|
|
499
|
+
* **7.14.4**:修复in的错误×3
|
|
500
|
+
* **7.14.5**:修复in的错误×4
|
|
501
|
+
* **7.14.6**:优化arr.large的类型
|
|
502
|
+
- **8.0.0**:兼容numpy数组
|
|
503
|
+
* **8.0.1**:修复8.0.0兼容numpy数组时没有形状参数的问题
|
|
504
|
+
* **8.0.2**:移除bool_hybrid_dtype,改用object
|
|
505
|
+
* **8.1.0**:利用ctypes加速密集部分的一些方法
|
|
506
|
+
* **8.1.1**:修复8.1.0版本中的“AttributeError: '_CompactBoolArray' object has no attribute 'small'”问题
|
|
507
|
+
* **8.1.2**:修复8.1.1版本中的“TypeError”
|
|
508
|
+
* **8.1.3**:修复8.1.2版本中的“NameError”问题
|
|
509
|
+
* **8.1.4**:修复8.1.3版本中的“TypeError”问题
|
|
510
|
+
* **8.1.5**:修复8.1.4版本中的“AttributeError”问题
|
|
511
|
+
* **8.2.0**:支持哈希
|
|
512
|
+
* **8.2.1**:修复8.2.0版本中的NameError
|
|
513
|
+
* **8.2.2**:修复8.2.1版本中的IndexError
|
|
514
|
+
- **9.0.0**:详情见上
|
|
515
|
+
* **9.0.1**:小更新,优化optimize方法
|
|
516
|
+
* **9.1.0**:新增二维数组的optimize与memory\_usage,优化二维数组的位运算,给BHA\_Bool新增__rand__、**ror**、__rxor__等等
|
|
517
|
+
* **9.1.1**:修复9.1.0版本中的TypeError: unsupported operand type(s) for +: 'int' and 'method'错误
|
|
518
|
+
* **9.1.2**:修复9.1.1版本中的NameError: name 'equivalent\_numpy\_mem' is not defined错误
|
|
519
|
+
* **9.1.3**:修复9.1.2版本中的NameError: name 'need\_optimize' is not defined错误
|
|
520
|
+
* **9.2.0**:详情自己发现,提示:看看iter(arr)的返回值类型、调用一下二维数组的optimize、看看BHA\_Bool是不是一个类
|
|
521
|
+
* **9.3.0**:将find()返回值改为BHA_List,将BHA_Iterator变为可复用迭代器
|
|
522
|
+
* **9.4.0**:新增关闭哈希复用功能
|
|
523
|
+
* **9.4.1**:修复了被修改保护和被删除保护的bug
|
|
524
|
+
* **9.4.2**:修复被修改保护和被删除保护的bug×2
|
|
525
|
+
* **9.4.3**:移除只读辅类
|
|
526
|
+
* **9.4.4**:修复9.4.3版本中的NameError: name 'ReadOnlyAttribute' is not defined错误
|
|
527
|
+
* **9.4.5**:修复9.4.0~9.4.4数组索引访问重点TypeError: 'NoneType' object is not subscriptable
|
|
528
|
+
* **9.4.6**:让切片、位运算的哈希复用状态和self一致
|
|
529
|
+
* **9.5.0**:新增ResurrectMeta元类
|
|
530
|
+
* **9.5.1**:修复9.5.0版本中的ResurrectMeta的实例__repr__无限递归问题
|
|
531
|
+
* **9.5.2**:修复9.5.1版本中的ResurrectMeta的实例__repr__和__str__的无限递归问题
|
|
532
|
+
* **9.6.0**:新增用装饰器给实例添加动态方法的功能
|
|
533
|
+
* **9.6.1**:修复9.6.0中的参数传递问题
|
|
534
|
+
* **9.6.2**:可以使用BHA\_Iterator
|
|
535
|
+
* **9.6.3**:修复常变量删除拦截的逻辑错误
|
|
536
|
+
* **9.6.4**:把常变量删除拦截的逻辑变得更可读
|
|
537
|
+
* **9.6.5**:修复TabError错误
|
|
538
|
+
* **9.6.6**:把常变量删除拦截变得更可读
|
|
539
|
+
* **9.6.7**:修复常变量删除拦截的逻辑错误
|
|
540
|
+
* **9.6.8**:修复常变量删除拦截的逻辑错误
|
|
541
|
+
* **9.6.9**:修复9.6.8中的SyntaxError错误
|
|
542
|
+
* **9.6.10**:修复9.6.9版本中的AttributeError错误
|
|
543
|
+
* **9.6.11**:修复9.6.10版本中的AttributeError: 'dict' object has no attribute '**dict**'. Did you mean: '**dir**'?错误
|
|
544
|
+
* **9.6.12**:修复AttributeError错误
|
|
545
|
+
* **9.6.13**:修复常变量删除拦截的逻辑错误
|
|
546
|
+
* **9.6.14**:修复常变量删除拦截的逻辑错误×2
|
|
547
|
+
* **9.6.15**:修复AttributeError错误
|
|
548
|
+
* **9.6.16**:修复常变量删除拦截的逻辑错误
|
|
549
|
+
* **9.6.17**:类标识错乱修复
|
|
550
|
+
* **9.6.18**:加快了迭代速度
|
|
551
|
+
* **9.6.19**:使用缓存加速
|
|
552
|
+
* **9.6.20**:修复TypeError: unhashable type: 'dict'错误
|
|
553
|
+
* **9.6.21**:修复RecursionError: maximum recursion depth exceeded while calling a Python object错误
|
|
554
|
+
* **9.6.22**:修复RecursionError: maximum recursion depth exceeded while calling a Python object错误×2
|
|
555
|
+
* **9.6.23**:增加了对bool\_hybrid_array.__dict__的防御机制
|
|
556
|
+
* **9.6.23.post1**:修复bool_hybrid_array.__dict__的防御机制的问题
|
|
557
|
+
* **9.6.23.post2**:修复bool_hybrid_array.__dict__的防御机制的问题×2
|
|
558
|
+
* **9.6.23.post3**:修复bool_hybrid_array.__dict__的防御机制的部分逻辑漏洞
|
|
559
|
+
* **9.6.23.post4**:修复bool_hybrid_array.__dict__的防御机制的部分逻辑漏洞×2
|
|
560
|
+
* **9.6.24**:和9.6.23.post4相同,正式版本发布
|
|
561
|
+
* **9.6.25**:增加了对bool\_hybrid\_array里的类的\_\_dict\_\_的防御机制
|
|
562
|
+
* **9.6.25.post1**:修复了“变量名不能以数字开头”的错误
|
|
563
|
+
* **9.6.26**:和9.6.25.post1相同,正式版本发布
|
|
564
|
+
* **9.6.27**:尝试修复T/F相等性判断错误
|
|
565
|
+
* **9.6.27.post1**:尝试修复T/F相等性判断错误×2
|
|
566
|
+
* **9.6.27.post2**:尝试修复T/F相等性判断错误×3
|
|
567
|
+
* **9.6.28**:和* **9.6.27.post2**相同,正式版本发布
|
|
568
|
+
* **9.6.29**:解决了密集区numpy的缓存同步问题和拷贝问题
|
|
569
|
+
* **9.6.30**:增加了”测试代码“文件
|
|
570
|
+
* **9.7.0**:增加了view方法
|
|
571
|
+
* **9.7.1**:修复__array__方法部分的错误
|
|
572
|
+
* **9.7.2**:修复9.7.1版本中numpy 2.0对__array__方法参数的警告
|
|
573
|
+
* **9.7.3**:解决np.array(arr)解释器莫名其妙退出的问题
|
|
574
|
+
* **9.8.0**:增加python 3.9以下的版本泛型、联合类型支持
|
|
575
|
+
* **9.8.1**:让python 3.10+版本泛型、联合类型分别为types.UnionType和types.GenericAlias
|
|
576
|
+
* **9.8.2**:修复9.8.1版本中联合类型返回值的错误
|
|
577
|
+
* **9.9.0**:新增BHA_Function动态创建函数的功能
|
|
578
|
+
* **9.9.1**:增加一下保护字典的保护名单
|
|
579
|
+
* **9.9.2**:加快了any和all的速度
|
|
580
|
+
* **9.9.3**:开放ProtectedBuiltinsDict类型
|
|
581
|
+
* **9.10.0**:新增Ask_BHA和Create_BHA
|
|
582
|
+
* **9.10.1**:修复TypeError: 'BoolHybridArray' object cannot be interpreted as an integer的错误
|
|
583
|
+
* **9.10.2**:解决多补前导零的问题
|
|
584
|
+
* **9.10.3**:解决少补前导零的问题
|
|
585
|
+
* **9.10.4**:新增numba_opt功能
|
|
586
|
+
* **9.10.5**:新增BHA_Opener工具包
|
|
587
|
+
* **9.10.6**:给Ask_BHA新增了mmap优化
|
|
588
|
+
* **9.10.7**:修复了RecursionError: maximum recursion depth exceeded错误
|
|
589
|
+
* **9.10.8**:给Create_BHA新增了mmap优化
|
|
590
|
+
* **9.10.9**:修复9.10.8版本中的NameError错误
|
|
591
|
+
* **9.10.10**:新增int_array模块
|
|
592
|
+
* **9.10.11**:修复NameError: name 'int_array' is not defined. Did you mean: 'bytearray'?的错误
|
|
593
|
+
* **9.10.12**:把find方法的返回值改为IntHybridArray
|
|
594
|
+
* **9.10.13**:给IntHybridArray新增多种列表操作
|
|
595
|
+
* **9.10.14**:修复IntHybridArray中因单个 0 导致所有数字位长被压缩到 1的问题
|
|
596
|
+
* **9.10.15**:修复IntHybridArray变成布尔数组的错误
|
|
597
|
+
* **9.10.16**:新增Python 3.14时的jit优化加速
|
|
598
|
+
* **9.10.17**:给保护字典添加__import__方法,支持from导入
|
|
599
|
+
* **9.10.18**:新增BoolHybridArray的序列化和反序列化支持
|
|
600
|
+
* **9.10.18.post1**:修复TypeError: cannot pickle 'itertools._tee' object错误
|
|
601
|
+
* **9.10.18.post2**:尝试修复“满屏错误”的问题
|
|
602
|
+
* **9.10.18.post3**:尝试修复“满屏错误”的问题×2
|
|
603
|
+
* **9.10.18.post4**:尝试修复“满屏错误”的问题×3
|
|
604
|
+
* **9.10.19**:和9.10.18.post4相同,正式版本发布
|
|
605
|
+
* **9.10.20**:优化性能,增加BHA_jit_log日志
|
|
606
|
+
* **9.10.21**:优化Ask_BHA,移除BHA_jit_log日志
|
|
607
|
+
* **9.10.22**:进一步优化Ask_BHA的性能
|
|
608
|
+
* **9.11.0**:新增对7.3.10以上版本的PyPy解释器的支持
|
|
609
|
+
* **9.11.1**:修复PyPy解释器下的保护机制过度保护bug
|
|
610
|
+
* **9.11.2**:尝试修复IntHybridArray索引修改的错误
|
|
611
|
+
* **9.11.3**:修复NameError: name 'lst' is not defined. Did you mean: 'list'?错误
|
|
612
|
+
* **9.11.4**:修复TypeError: __dict__ must be set to a dictionary, not a 'IntHybridArray'的错误
|
|
613
|
+
* **9.11.5**:新增BHA_Queue双栈实现队列
|
|
614
|
+
* **9.11.6**:修复从9.11.3版本开始cpython用户无法安装bool-hybrid-array包的问题
|
|
615
|
+
* **9.11.7**:修复TypeError: 'map' object is not reversible的错误
|
|
616
|
+
* **9.11.8**:增加了Windows系统Python3.14的C扩展优化
|
|
617
|
+
* **9.11.9**:修复BHA_Queue的bug,新增cin和cout(使用方式:a = ctypes.c_int();cin >> a;cout << a,支持各种ctypes类型、numpy标量)
|
|
618
|
+
* **9.11.10**:修复cin的AttributeError的错误
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
## **彩蛋:**
|
|
624
|
+
|
|
625
|
+
* Q:为什么要“密集+稀疏?”
|
|
626
|
+
* A:因为在做线性筛的时候遇到了个问题:密集数组太占内存,稀疏数组跑起来卡,所以就做了这个
|
|
627
|
+
* Q:为什么要“密集`numpy.ndarray`,稀疏`array.array`”?
|
|
628
|
+
* A:因为他本来只做线性筛,只修改数组,不`insert`、`pop`、`remove`;稀疏区长度变化平凡,要`numpy.ndarray`的“**修改就创建新实例**”的话那炸了,所以用`array.array`,密集区长度不变;所以可以用更高效的`numpy.ndarray`
|
|
629
|
+
* Q:为什么要有`TruesArray`/`FalsesArray`?直接用`BoolHybridArr([True]*n)`/`BoolHybridArr([False]*n)`不行吗?
|
|
630
|
+
* A:因为`BoolHybridArr([True]*n`)在计算`[True]*n`时如果n太大,那么列表的内存会溢出
|
|
631
|
+
* Q:**`BoolHybridArr`**和**`BoolHybridArray`**有什么区别?
|
|
632
|
+
* A:BoolHybridArray是本库中的**核心类**,所有函数都是围绕他进行的,但需要`split_index`,`size`,`is_sparse`;
|
|
633
|
+
BoolHybridArr是一个**函数**,用于把一个可迭代对象转为`BoolHybridArray`类
|
|
634
|
+
* Q:为什么不建议把太大的本类型数组打印?
|
|
635
|
+
* A:虽然BoolHybridArray类型数组省内存,但字符串不省内存,一个`True`要4字节,一个`False`要5字节,连逗号都要占1字节(`numpy.ndarray`:我都比字符串省内存)
|
|
636
|
+
- Q:为什么使用在Windows终端使用PyPy时建议先调用`chcp 65001`再启动PyPy?
|
|
637
|
+
* A:因为本库有很多的的中文报错和打印,项目里也可能会有。Windows终端里的PyPy默认是GBK编码,有中文时会乱码。chcp 65001可以切换到UTF-8编码,防止乱码。
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
## 源代码和原理
|
|
642
|
+
|
|
643
|
+
请见[来看看我自己的布尔数组吧!](https://code.xdf.cn/freecode/editor?no=80cd07aa023fb2448069e6d8dd50bb5d&type=2&org=code)
|
|
644
|
+
|
|
645
|
+
## 许可证
|
|
646
|
+
|
|
647
|
+
本项目采用**MIT许可证**,详情参见**LICENSE文件**。
|
|
648
|
+
|