bool-hybrid-array 9.6.4__py3-none-any.whl → 9.10.19__py3-none-any.whl

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.
@@ -0,0 +1,203 @@
1
+ from __future__ import annotations
2
+ from ..core import *
3
+ import builtins
4
+
5
+ class IntBitTag(BHA_Bool, metaclass=ResurrectMeta):
6
+ def __str__(self):
7
+ return "'-1'" if (hasattr(self, 'is_sign_bit') and self.is_sign_bit and self) else "'1'" if self else "'0'"
8
+ __repr__ = __str__
9
+
10
+ class IntHybridArray(BoolHybridArray):
11
+ def __init__(self, int_array: list[int], bit_length: int = 8):
12
+ self.bit_length = bit_length
13
+ bool_data = []
14
+ max_required_bits = 1
15
+ for num in int_array:
16
+ if num == 0:
17
+ required_bits = 1
18
+ else:
19
+ abs_num = abs(num)
20
+ num_bits_needed = abs_num.bit_length()
21
+ required_bits = 1 + num_bits_needed
22
+ if required_bits > max_required_bits:
23
+ max_required_bits = required_bits
24
+ self.bit_length = max_required_bits
25
+ for num in int_array:
26
+ if num >= 0:
27
+ sign_bit = False
28
+ num_bits = [bool((num >> i) & 1) for i in range(self.bit_length - 1)]
29
+ else:
30
+ sign_bit = True
31
+ abs_num = abs(num)
32
+ num_bits = [not bool((abs_num >> i) & 1) for i in range(self.bit_length - 1)]
33
+ carry = 1
34
+ for j in range(len(num_bits)):
35
+ if carry:
36
+ num_bits[j] = not num_bits[j]
37
+ carry = 0 if num_bits[j] else 1
38
+ bool_data.append(sign_bit)
39
+ bool_data.extend(num_bits)
40
+ self.total_bits = len(bool_data)
41
+ super().__init__(0, self.total_bits, False, IntBitTag, False)
42
+ for idx in range(self.total_bits):
43
+ if idx < self.size:
44
+ super().__setitem__(idx, bool_data[idx])
45
+ else:
46
+ super().append(bool_data[idx])
47
+ for i in range(0, self.total_bits, self.bit_length):
48
+ if i < self.size:
49
+ bit_tag = super().__getitem__(i)
50
+ bit_tag.is_sign_bit = True
51
+
52
+ def to_int(self, bit_chunk):
53
+ sign_bit = bit_chunk[0].value
54
+ num_bits = [bit.value for bit in bit_chunk[1:]]
55
+ if not sign_bit:
56
+ num = 0
57
+ for j in range(len(num_bits)):
58
+ if num_bits[j]:
59
+ num += (1 << j)
60
+ else:
61
+ num_bits_inv = [not b for b in num_bits]
62
+ carry = 1
63
+ for j in range(len(num_bits_inv)):
64
+ if carry:
65
+ num_bits_inv[j] = not num_bits_inv[j]
66
+ carry = 0 if num_bits_inv[j] else 1
67
+ num = 0
68
+ for j in range(len(num_bits_inv)):
69
+ if num_bits_inv[j]:
70
+ num += (1 << j)
71
+ num = -num
72
+ return num
73
+
74
+ def __getitem__(self, key):
75
+ if isinstance(key, slice):
76
+ start, stop, step = key.indices(len(self))
77
+ result = []
78
+ for i in range(start, stop, step):
79
+ block_start = i * self.bit_length
80
+ block_end = block_start + self.bit_length
81
+ if block_end > self.size:
82
+ raise IndexError("索引超出范围")
83
+ bit_chunk = [super().__getitem__(j) for j in range(block_start, block_end)]
84
+ num = self.to_int(bit_chunk)
85
+ result.append(num)
86
+ return IntHybridArray(result, self.bit_length)
87
+ key = key if key >= 0 else key + len(self)
88
+ if not (0 <= key < len(self)):
89
+ raise IndexError("索引超出范围")
90
+ block_start = key * self.bit_length
91
+ block_end = block_start + self.bit_length
92
+ if block_end > self.size:
93
+ raise IndexError("索引超出范围")
94
+ bit_chunk = [super().__getitem__(j) for j in range(block_start, block_end)]
95
+ return self.to_int(bit_chunk)
96
+
97
+ def __setitem__(self, key, value):
98
+ value = int(value)
99
+ if isinstance(key, slice):
100
+ start, stop, step = key.indices(len(self))
101
+ values = list(value) if isinstance(value, (list, tuple, IntHybridArray)) else [value] * ((stop - start + step - 1) // step)
102
+ idx = 0
103
+ for int_idx in range(start, stop, step):
104
+ block_start = int_idx * self.bit_length
105
+ block_end = block_start + self.bit_length
106
+ if block_end > self.size:
107
+ raise IndexError("索引超出范围")
108
+ num = values[idx % len(values)]
109
+ if num >= 0:
110
+ sign_bit = False
111
+ num_bits = [bool((num >> i) & 1) for i in range(self.bit_length - 1)]
112
+ else:
113
+ sign_bit = True
114
+ abs_num = abs(num)
115
+ num_bits = [not bool((abs_num >> i) & 1) for i in range(self.bit_length - 1)]
116
+ carry = 1
117
+ for j in range(len(num_bits)):
118
+ if carry:
119
+ num_bits[j] = not num_bits[j]
120
+ carry = 0 if num_bits[j] else 1
121
+ bool_data = [sign_bit] + num_bits
122
+ for bit_idx in range(self.bit_length):
123
+ super().__setitem__(block_start + bit_idx, bool_data[bit_idx])
124
+ idx += 1
125
+ return
126
+ key = key if key >= 0 else key + len(self)
127
+ if not (0 <= key < len(self)):
128
+ raise IndexError("索引超出范围")
129
+ block_start = key * self.bit_length
130
+ block_end = block_start + self.bit_length
131
+ if block_end > self.size:
132
+ raise IndexError("索引超出范围")
133
+ num = value
134
+ if num >= 0:
135
+ sign_bit = False
136
+ num_bits = [bool((num >> i) & 1) for i in range(self.bit_length - 1)]
137
+ else:
138
+ sign_bit = True
139
+ abs_num = abs(num)
140
+ num_bits = [not bool((abs_num >> i) & 1) for i in range(self.bit_length - 1)]
141
+ carry = 1
142
+ for j in range(len(num_bits)):
143
+ if carry:
144
+ num_bits[j] = not num_bits[j]
145
+ carry = 0 if num_bits[j] else 1
146
+ bool_data = [sign_bit] + num_bits
147
+ for bit_idx in range(self.bit_length):
148
+ super().__setitem__(block_start + bit_idx, bool_data[bit_idx])
149
+
150
+ def __iter__(self):
151
+ for i in range(0, self.total_bits, self.bit_length):
152
+ if i + self.bit_length > self.size:
153
+ break
154
+ bit_chunk = [super().__getitem__(j) for j in range(i, i + self.bit_length)]
155
+ yield self.to_int(bit_chunk)
156
+
157
+ def __str__(self):
158
+ return f"IntHybridArray([{', '.join(map(str, self))}])"
159
+ __repr__ = __str__
160
+
161
+ def __len__(self):
162
+ return self.total_bits // self.bit_length
163
+ def __delitem__(self, index: int = -1):
164
+ index = index if index >= 0 else index + len(self)
165
+ if not (0 <= index < len(self)):
166
+ raise IndexError("删除索引超出范围")
167
+ target_num = self[index]
168
+ pop_bit_start = index * self.bit_length
169
+ pop_bit_end = pop_bit_start + self.bit_length
170
+ for _ in range(self.bit_length):
171
+ super().__delitem__(pop_bit_start)
172
+ self.total_bits -= self.bit_length
173
+ def index(self, value):
174
+ value = int(value)
175
+ x = f"{value} 不在 IntHybridArray 中"
176
+ for idx in range(len(self)+2>>2):
177
+ if self[idx] == value:
178
+ return idx
179
+ elif self[-idx] == value:
180
+ x = len(self)-idx
181
+ if x != f"{value} 不在 IntHybridArray 中":
182
+ return x
183
+ raise ValueError(x)
184
+ def rindex(self, value):
185
+ value = int(value)
186
+ x = f"{value} 不在 IntHybridArray 中"
187
+ for idx in range(len(self)+2>>2):
188
+ if self[-idx] == value:
189
+ return -idx
190
+ elif self[idx] == value:
191
+ x = -(len(self)-idx)
192
+ if x != f"{value} 不在 IntHybridArray 中":
193
+ return x
194
+ raise ValueError(x)
195
+ def extend(self, iterable:Iterable) -> None:
196
+ if isinstance(iterable, (Iterator, Generator, map)):
197
+ iterable,copy = itertools.tee(iterable, 2)
198
+ len_ = sum(1 for _ in copy)
199
+ else:
200
+ len_ = len(iterable)
201
+ self.total_bits += len_*self.bit_length
202
+ for i,j in zip(range(len_),iterable):
203
+ self[-i-1] = j
@@ -0,0 +1,2 @@
1
+ # **作者的秘密:我才10岁!!!**
2
+
@@ -1,24 +1,39 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bool-hybrid-array
3
- Version: 9.6.4
3
+ Version: 9.10.19
4
4
  Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
5
+ Home-page: https://github.com/BKsell/bool-hybrid-array
5
6
  Author: 蔡靖杰
6
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
7
11
  Keywords: boolean array,compact storage
8
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
9
20
  Classifier: License :: OSI Approved :: MIT License
10
21
  Classifier: Operating System :: OS Independent
11
22
  Requires-Python: >=3.8
12
23
  Description-Content-Type: text/markdown
13
24
  License-File: LICENSE
14
25
  Requires-Dist: numpy>=1.19.0
26
+ Provides-Extra: int-array
15
27
  Dynamic: author
16
28
  Dynamic: author-email
17
29
  Dynamic: classifier
18
30
  Dynamic: description
19
31
  Dynamic: description-content-type
32
+ Dynamic: home-page
20
33
  Dynamic: keywords
21
34
  Dynamic: license-file
35
+ Dynamic: project-url
36
+ Dynamic: provides-extra
22
37
  Dynamic: requires-dist
23
38
  Dynamic: requires-python
24
39
  Dynamic: summary
@@ -29,7 +44,7 @@ Dynamic: summary
29
44
 
30
45
  ## ***注:大版本号更新并非不兼容更新,而是重大更新***
31
46
 
32
- ***注意:目前社区中若存在名称类似(如包含 “bool-hybrid-array”+ 后缀、boolean_array、validate.io-boolean-array)的库,均与本项目(bool-hybrid-array)无关联,本项目的所有功能设计、代码实现均为独立开发;***
47
+ ***注意:目前社区中若存在名称类似(如包含 “bool-hybrid-array”+ 后缀、boolean\_array、validate.io-boolean-array)的库,均与本项目(bool-hybrid-array)无关联,本项目的所有功能设计、代码实现均为独立开发;***
33
48
  ***其他平台里的类似名库绝不是我的库***
34
49
 
35
50
  ***注意:若你的原bool-hybrid-array库版本<7.10.9,看到此版本请立即更新到>=7.10.9版本,其他版本的导入都有问题!!!***
@@ -65,14 +80,16 @@ pip install -U bool-hybrid-array
65
80
  * **操作便捷**:支持类似列表的索引、切片和赋值操作
66
81
  * **快速统计**:内置高效的计数和布尔判断方法
67
82
  * **速度优势**:修改元素的时间还不比list慢
83
+
68
84
  ## 快速开始
69
85
 
70
86
  ### 基本用法
87
+
71
88
  ```python
72
89
 
73
90
  # 导入类
74
91
 
75
- from bool_hybrid_array import BoolHybridArr,TruesArray,FalsesArray
92
+ from bool_hybrid_array import *
76
93
 
77
94
  # 创建实例
78
95
 
@@ -88,17 +105,24 @@ print(arr[0]) # 输出: True;
88
105
 
89
106
  print(arr[1:4]) # 输出:  BoolHybridArr([False, True, False]);
90
107
 
91
- print(arr2)  # 输出:  BoolHybridArr(True, True, True]);
108
+ print(arr2)  # 输出:  BoolHybridArr([True, True, True]);
92
109
 
93
110
  print(arr3)  # 输出:  BoolHybridArr([False, False, False]);
94
111
  ```
112
+
95
113
  # 联系方式
96
114
 
97
115
  * 若遇到 Bug 或有功能建议,可发送邮件至:1289270215@qq.com(更正规)
98
116
  * 微信联系:18250730129(注:这是微信绑定的电话号码,优先微信沟通,请勿拨打电话哦)(微信联系回复最快)
99
- * 抖音(绑定电话号码同微信)(有群聊,加入可讨论)
117
+ * 抖音(绑定的电话号码同微信)(有讨论群,加入可讨论)
118
+
119
+ # GitHub仓库
120
+
121
+ 英文版:[bool-hybrid-array.git](https://github.com/BKsell/bool-hybrid-array.git)
122
+ 中文版:[1083175506-bool-hybrid-array](https://www.github-zh.com/projects/1083175506-bool-hybrid-array)
100
123
 
101
124
  # 修改元素
125
+
102
126
  ```python
103
127
 
104
128
  arr[2] = False
@@ -106,7 +130,9 @@ arr[2] = False
106
130
  print(arr) # 输出: BoolHybridArr([True, False, False, False, True])
107
131
 
108
132
  ```
133
+
109
134
  ### 存储优化
135
+
110
136
  ```python
111
137
 
112
138
  # 创建包含大量布尔值的数组(大部分为False)
@@ -115,14 +141,16 @@ big_arr = BoolHybridArr([i % 100 == 0 for i in range(10000)])
115
141
 
116
142
  # 查看存储模式(此时应为稀疏模式)
117
143
 
118
- print(repr(big_arr)) # 输出: BoolHybridArray(split_index=100,size=10000,is_sparse=True,small_len=100,large_len=)不好意思large\_len我不知道
144
+ print(repr(big_arr)) # 输出: BoolHybridArray(split_index=100,size=10000,is_sparse=True,small_len=100,large_len=)不好意思large_len我不知道
119
145
 
120
146
  # 自动优化存储
121
147
 
122
148
  big_arr.optimize()
123
149
 
124
150
  ```
151
+
125
152
  ### 其他功能
153
+
126
154
  ```python
127
155
 
128
156
  # 统计True的数量
@@ -185,7 +213,7 @@ big_arr.optimize() # 调用优化方法
185
213
 
186
214
  print(big_arr.memory_usage(detail=True)["是否需要优化"])#"否"
187
215
 
188
- '''当处理动态变化的布尔数组(如频繁增删元素)时,建议在关键操作后调用memory_usage(detail=True)检查状态,通过optimize()保持最优性能。'''
216
+ '''当处理动态变化的布尔数组(如频繁增删元素)时,建议在关键操作后调用memory\_usage(detail=True)检查状态,通过optimize()保持最优性能。'''
189
217
 
190
218
  #将数组转为int类型(7.11.0新增):
191
219
 
@@ -221,10 +249,9 @@ print(arr << -1) # 负数左移:等价于右移1位 → [True]
221
249
 
222
250
  #兼容numpy数组(8.0.0版本新增)
223
251
 
224
- arr_BoolHybridArray = BoolHybridArr([])
252
+ arr_BoolHybridArray = BoolHybridArr(\[])
225
253
  arr_BoolHybridArray <<= 10
226
254
  arr_BoolHybridArray <<= 10000
227
- arr_BoolHybridArray <<= 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000
228
255
  array_numpy = np.array([arr_BoolHybridArray,arr_BoolHybridArray])
229
256
 
230
257
  #支持哈希(8.2.0版本新增)
@@ -232,6 +259,7 @@ array_numpy = np.array([arr_BoolHybridArray,arr_BoolHybridArray])
232
259
  set_ = {arr_BoolHybridArray}#不会报错呦
233
260
 
234
261
  ```
262
+
235
263
  # ***v9.0.0重大更新***
236
264
 
237
265
  ```python
@@ -298,10 +326,90 @@ def toggle_range(self, start: int, end: int):
298
326
 
299
327
  arr.toggle_range(0,1)
300
328
 
301
- print(arr)#输出:翻转 {0}-{1} 后:BoolHybridArr(False,True,True)
329
+ print(arr)#输出:翻转 {0}-{1} 后:BoolHybridArr([False,True,True])
330
+
331
+ toggle_range(arr,0,1)#输出:翻转 {0}-{1} 后:BoolHybridArr([True,False,True])
332
+
333
+ #view方法(9.7.0新增):
334
+
335
+ arr2 = arr.view()
336
+
337
+ arr2.extend([F,T])
338
+
339
+ arr2[2] = F
340
+
341
+ print(arr) #输出:BoolHybridArr([True,False,False,False,True])
342
+
343
+ #python 3.9以下的版本泛型、联合类型支持(9.8.0新增)
344
+
345
+ print(BHA_List[BoolHybridArray])#输出:bool_hybrid_array.BHA_List[bool_hybrid_array.BoolHybridArray]
346
+
347
+ 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以上)
348
+
349
+ #BHA_Function动态创建函数(9.9.0新增):
350
+
351
+ toggle_range = BHA_Function.string_define(
352
+ name = 'toggle_range',
353
+ text =
354
+ '''
355
+ for i in range(start, end + 1):
356
+ self[i] = not self[i] # 通过 self 操作实例的元素
357
+ print(f"翻转 {start}-{end} 后:", self)''',
358
+ positional = ('self','start', 'end'),
359
+ default = {})
360
+ toggle_range([0,0,1],0,1)#输出:翻转 0-1 后: [True, True, 1]
361
+
362
+ #开放ProtectedBuiltinsDict类型(9.9.3+)
363
+
364
+ Dict = ProtectedBuiltinsDict({'1':1,'2':2},protected_names = ['1','3'],name = 'Dict')
365
+
366
+ Dict['2'] = 1
367
+
368
+ print(Dict) #输出:{'1': 1, '2': 1}
369
+
370
+ try:Dict['1'] = 2
371
+ except Exception as e:print(e) #输出:禁止修改内置常量:__Dict__['1']
372
+
373
+ #Ask_BHA和Create_BHA(9.10.0新增):
374
+
375
+ arr = BoolHybridArr([T,F,F,F,T,T,F,F,F,T])
376
+ arr2 = BoolHybridArr([F,F,F,F,T,T,F,T,T,F])
377
+
378
+ arr3 = BHA_List([arr,arr2])
302
379
 
303
- toggle_range(arr,0,1)#输出:翻转 {0}-{1} 后:BoolHybridArr(True,False,True)
380
+ Create_BHA("single_bool_array",arr3)#自动生成single_bool_array.bha文件
304
381
 
382
+ print(Ask_BHA("single_bool_array"))
383
+
384
+ '''
385
+ 输出:
386
+ BHA_List([
387
+ BoolHybridArr([True,False,False,False,True,True,False,False,False,True]),
388
+ BoolHybridArr([False,False,False,False,True,True,False,True,True,False]),
389
+ ])
390
+ '''
391
+
392
+ #numba_opt函数优化(9.10.4版本新增)
393
+ try:numba_opt()
394
+ except:print("请先安装numba库!!!")
395
+
396
+ #int_array模块(9.10.10新增):
397
+
398
+ max_num = (1 << 256) - 1
399
+ min_num = -max_num
400
+
401
+ # 1. IntHybridArray:257位完美存储
402
+ arr_hybrid = int_array.IntHybridArray([max_num, min_num, 123456], bit_length=257)
403
+ print("✅ IntHybridArray存储结果:")
404
+ print(f"最大值:{arr_hybrid[0]}")
405
+ print(f"最小值:{arr_hybrid[1]}")
406
+
407
+ # 2. NumPy:用最大的int64尝试存储(必然失败)
408
+ try:
409
+ arr_np = np.array([max_num, min_num, 123456], dtype=np.int64)
410
+ print("\n❌ NumPy存储结果:", arr_np)
411
+ except OverflowError as e:
412
+ print(f"\n❌ NumPy存储失败:{e}")
305
413
 
306
414
  ```
307
415
 
@@ -316,7 +424,7 @@ toggle_range(arr,0,1)#输出:翻转 {0}-{1} 后:BoolHybridArr(True,False,Tru
316
424
 
317
425
  ## 版本历史
318
426
 
319
- * **7.8.13**:PyPI上的初始版本,支持基本功能和自动存储优化
427
+ - --7.8.13--:PyPI上的初始版本,支持基本功能和自动存储优化
320
428
  * **7.9.0**:添加TruesArray和FalsesArray
321
429
  * **7.9.1**:修复介绍的bug,增加copy功能
322
430
  * **7.9.2**:新增find()方法
@@ -327,7 +435,7 @@ toggle_range(arr,0,1)#输出:翻转 {0}-{1} 后:BoolHybridArr(True,False,Tru
327
435
  * **7.10.4**:修正样例代码中的错误,增加index/rindex的空数组处理
328
436
  * **7.10.5**:修复7.10.4版本index/rindex中size没加self的错误
329
437
  * **7.10.6**:比7.10.0进一步优化内部储存
330
- * **7.10.7**:新增arr.memory_usage方法查看是否优化,支持查看内存占用详情及优化建议,配合arr.optimize()实现存储自动调优
438
+ * **7.10.7**:新增arr.memory·_usage方法查看是否优化,支持查看内存占用详情及优化建议,配合arr.optimize()实现存储自动调优
331
439
  * **7.10.8**:增加cython加速
332
440
  * **7.10.9**:修复之前所有版本的导入问题
333
441
  * **7.10.10**:修复unit8溢出问题
@@ -336,7 +444,7 @@ toggle_range(arr,0,1)#输出:翻转 {0}-{1} 后:BoolHybridArr(True,False,Tru
336
444
  * **7.10.13**:尝试修复memory_usage方法的错误×3
337
445
  * **7.10.14**:尝试修复unit8溢出问题×2
338
446
  * **7.10.15**:尝试修复unit8溢出问题×3
339
- * **7.10.16**:修复unit8溢出问题×4+尝试修复memory_usage方法的错误×4
447
+ * **7.10.16**:修复unit8溢出问题×4+尝试修复memory\_usage方法的错误×4
340
448
  * **7.10.17**:尝试修复memory_usage方法的错误×4
341
449
  * **7.10.18**:尝试修复memory_usage方法的错误×5
342
450
  * **7.10.19**:尝试修复memory_usage方法的错误×6
@@ -358,7 +466,7 @@ toggle_range(arr,0,1)#输出:翻转 {0}-{1} 后:BoolHybridArr(True,False,Tru
358
466
  * **7.14.4**:修复in的错误×3
359
467
  * **7.14.5**:修复in的错误×4
360
468
  * **7.14.6**:优化arr.large的类型
361
- * **8.0.0**:兼容numpy数组
469
+ - --8.0.0--:兼容numpy数组
362
470
  * **8.0.1**:修复8.0.0兼容numpy数组时没有形状参数的问题
363
471
  * **8.0.2**:移除bool_hybrid_dtype,改用object
364
472
  * **8.1.0**:利用ctypes加速密集部分的一些方法
@@ -370,13 +478,13 @@ toggle_range(arr,0,1)#输出:翻转 {0}-{1} 后:BoolHybridArr(True,False,Tru
370
478
  * **8.2.0**:支持哈希
371
479
  * **8.2.1**:修复8.2.0版本中的NameError
372
480
  * **8.2.2**:修复8.2.1版本中的IndexError
373
- * **9.0.0**:详情见上
481
+ - --9.0.0--:详情见上
374
482
  * **9.0.1**:小更新,优化optimize方法
375
- * **9.1.0**:新增二维数组的optimize与memory_usage,优化二维数组的位运算,给BHA_Bool新增__rand__、__ror__、__rxor__等等
483
+ * **9.1.0**:新增二维数组的optimize与memory\_usage,优化二维数组的位运算,给BHA\_Bool新增__rand__、**ror**、__rxor__等等
376
484
  * **9.1.1**:修复9.1.0版本中的TypeError: unsupported operand type(s) for +: 'int' and 'method'错误
377
- * **9.1.2**:修复9.1.1版本中的NameError: name 'equivalent_numpy_mem' is not defined错误
378
- * **9.1.3**:修复9.1.2版本中的NameError: name 'need_optimize' is not defined错误
379
- * **9.2.0**:详情自己发现,提示:看看iter(arr)的返回值类型、调用一下二维数组的optimize、看看BHA_Bool是不是一个类
485
+ * **9.1.2**:修复9.1.1版本中的NameError: name 'equivalent\_numpy\_mem' is not defined错误
486
+ * **9.1.3**:修复9.1.2版本中的NameError: name 'need\_optimize' is not defined错误
487
+ * **9.2.0**:详情自己发现,提示:看看iter(arr)的返回值类型、调用一下二维数组的optimize、看看BHA\_Bool是不是一个类
380
488
  * **9.3.0**:将find()返回值改为BHA_List,将BHA_Iterator变为可复用迭代器
381
489
  * **9.4.0**:新增关闭哈希复用功能
382
490
  * **9.4.1**:修复了被修改保护和被删除保护的bug
@@ -390,30 +498,99 @@ toggle_range(arr,0,1)#输出:翻转 {0}-{1} 后:BoolHybridArr(True,False,Tru
390
498
  * **9.5.2**:修复9.5.1版本中的ResurrectMeta的实例__repr__和__str__的无限递归问题
391
499
  * **9.6.0**:新增用装饰器给实例添加动态方法的功能
392
500
  * **9.6.1**:修复9.6.0中的参数传递问题
393
- * **9.6.2**:可以使用BHA_Iterator
501
+ * **9.6.2**:可以使用BHA\_Iterator
394
502
  * **9.6.3**:修复常变量删除拦截的逻辑错误
395
503
  * **9.6.4**:把常变量删除拦截的逻辑变得更可读
504
+ * **9.6.5**:修复TabError错误
505
+ * **9.6.6**:把常变量删除拦截变得更可读
506
+ * **9.6.7**:修复常变量删除拦截的逻辑错误
507
+ * **9.6.8**:修复常变量删除拦截的逻辑错误
508
+ * **9.6.9**:修复9.6.8中的SyntaxError错误
509
+ * **9.6.10**:修复9.6.9版本中的AttributeError错误
510
+ * **9.6.11**:修复9.6.10版本中的AttributeError: 'dict' object has no attribute '**dict**'. Did you mean: '**dir**'?错误
511
+ * **9.6.12**:修复AttributeError错误
512
+ * **9.6.13**:修复常变量删除拦截的逻辑错误
513
+ * **9.6.14**:修复常变量删除拦截的逻辑错误×2
514
+ * **9.6.15**:修复AttributeError错误
515
+ * **9.6.16**:修复常变量删除拦截的逻辑错误
516
+ * **9.6.17**:类标识错乱修复
517
+ * **9.6.18**:加快了迭代速度
518
+ * **9.6.19**:使用缓存加速
519
+ * **9.6.20**:修复TypeError: unhashable type: 'dict'错误
520
+ * **9.6.21**:修复RecursionError: maximum recursion depth exceeded while calling a Python object错误
521
+ * **9.6.22**:修复RecursionError: maximum recursion depth exceeded while calling a Python object错误×2
522
+ * **9.6.23**:增加了对bool\_hybrid_array.__dict__的防御机制
523
+ * **9.6.23.post1**:修复bool_hybrid_array.__dict__的防御机制的问题
524
+ * **9.6.23.post2**:修复bool_hybrid_array.__dict__的防御机制的问题×2
525
+ * **9.6.23.post3**:修复bool_hybrid_array.__dict__的防御机制的部分逻辑漏洞
526
+ * **9.6.23.post4**:修复bool_hybrid_array.__dict__的防御机制的部分逻辑漏洞×2
527
+ * **9.6.24**:和9.6.23.post4相同,正式版本发布
528
+ * **9.6.25**:增加了对bool\_hybrid\_array里的类的\_\_dict\_\_的防御机制
529
+ * **9.6.25.post1**:修复了“变量名不能以数字开头”的错误
530
+ * **9.6.26**:和9.6.25.post1相同,正式版本发布
531
+ * **9.6.27**:尝试修复T/F相等性判断错误
532
+ * **9.6.27.post1**:尝试修复T/F相等性判断错误×2
533
+ * **9.6.27.post2**:尝试修复T/F相等性判断错误×3
534
+ * **9.6.28**:和* **9.6.27.post2**相同,正式版本发布
535
+ * **9.6.29**:解决了密集区numpy的缓存同步问题和拷贝问题
536
+ * **9.6.30**:增加了”测试代码“文件
537
+ * **9.7.0**:增加了view方法
538
+ * **9.7.1**:修复__array__方法部分的错误
539
+ * **9.7.2**:修复9.7.1版本中numpy 2.0对__array__方法参数的警告
540
+ * **9.7.3**:解决np.array(arr)解释器莫名其妙退出的问题
541
+ * **9.8.0**:增加python 3.9以下的版本泛型、联合类型支持
542
+ * **9.8.1**:让python 3.10+版本泛型、联合类型分别为types.UnionType和types.GenericAlias
543
+ * **9.8.2**:修复9.8.1版本中联合类型返回值的错误
544
+ * **9.9.0**:新增BHA_Function动态创建函数的功能
545
+ * **9.9.1**:增加一下保护字典的保护名单
546
+ * **9.9.2**:加快了any和all的速度
547
+ * **9.9.3**:开放ProtectedBuiltinsDict类型
548
+ * **9.10.0**:新增Ask_BHA和Create_BHA
549
+ * **9.10.1**:修复TypeError: 'BoolHybridArray' object cannot be interpreted as an integer的错误
550
+ * **9.10.2**:解决多补前导零的问题
551
+ * **9.10.3**:解决少补前导零的问题
552
+ * **9.10.4**:新增numba_opt功能
553
+ * **9.10.5**:新增BHA_Opener工具包
554
+ * **9.10.6**:给Ask_BHA新增了mmap优化
555
+ * **9.10.7**:修复了RecursionError: maximum recursion depth exceeded错误
556
+ * **9.10.8**:给Create_BHA新增了mmap优化
557
+ * **9.10.9**:修复9.10.8版本中的NameError错误
558
+ * **9.10.10**:新增int_array模块
559
+ * **9.10.11**:修复NameError: name 'int_array' is not defined. Did you mean: 'bytearray'?的错误
560
+ * **9.10.12**:把find方法的返回值改为IntHybridArray
561
+ * **9.10.13**:给IntHybridArray新增多种列表操作
562
+ * **9.10.14**:修复IntHybridArray中因单个 0 导致所有数字位长被压缩到 1的问题
563
+ * **9.10.15**:修复IntHybridArray变成布尔数组的错误
564
+ * **9.10.16**:新增Python 3.14时的jit优化加速
565
+ * **9.10.17**:给保护字典添加__import__方法,支持from导入
566
+ * **9.10.18**:新增BoolHybridArray的序列化和反序列化支持
567
+ * **9.10.18.post1**:修复TypeError: cannot pickle 'itertools._tee' object错误
568
+ * **9.10.18.post2**:尝试修复“满屏错误”的问题
569
+ * **9.10.18.post3**:尝试修复“满屏错误”的问题×2
570
+ * **9.10.18.post4**:尝试修复“满屏错误”的问题×3
571
+ * **9.10.19**:和9.10.18.post4相同,正式版本发布
396
572
 
397
573
 
398
574
 
399
575
  ## **彩蛋:**
400
576
 
401
- - Q:为什么要“密集+稀疏?”
402
- - A:因为在做线性筛的时候遇到了个问题:密集数组太占内存,稀疏数组跑起来卡,所以就做了这个
403
- - Q:为什么要“密集numpy.ndarray,稀疏array.array”?
404
- - A:因为他本来只做线性筛,只修改数组,不insertpopremove;稀疏区长度变化平凡,要numpy.ndarray的“**修改就创建新实例**”的话那炸了,所以用array.array,密集区长度不变;所以可以用更高效的numpy.ndarray
405
- - Q:为什么要有TruesArray/FalsesArray?直接用BoolHybridArr(\[True]\*n)/BoolHybridArr(\[False]\*n)不行吗?
406
- - A:因为BoolHybridArr(\[True]\*n)在计算\[True]\*n时如果n太大,那么列表的内存会溢出
407
- - Q:**BoolHybridArr**和**BoolHybridArray**有什么区别?
408
- - A:BoolHybridArray是本库中的**核心类**,所有函数都是围绕他进行的,但需要split\_index,size,is\_sparse;
409
- BoolHybridArr是一个**函数**,用于把一个可迭代对象转为BoolHybridArray
410
- - Q:为什么不建议把太大的本类型数组打印?
411
- - A:虽然本类型数组省内存,但字符串不省内存,一个True4字节,一个False5字节,连逗号都要占1字节(numpy.ndarray:我都比字符串省内存)
577
+ * Q:为什么要“密集+稀疏?”
578
+ * A:因为在做线性筛的时候遇到了个问题:密集数组太占内存,稀疏数组跑起来卡,所以就做了这个
579
+ * Q:为什么要“密集`numpy.ndarray`,稀疏`array.array`”?
580
+ * A:因为他本来只做线性筛,只修改数组,不`insert`、`pop`、`remove`;稀疏区长度变化平凡,要`numpy.ndarray`的“**修改就创建新实例**”的话那炸了,所以用`array.array`,密集区长度不变;所以可以用更高效的`numpy.ndarray`
581
+ * Q:为什么要有`TruesArray`/`FalsesArray`?直接用`BoolHybridArr([True]*n)`/`BoolHybridArr([False]*n)`不行吗?
582
+ * A:因为`BoolHybridArr([True]*n`)在计算`[True]*n`时如果n太大,那么列表的内存会溢出
583
+ * Q:**`BoolHybridArr`**和**`BoolHybridArray`**有什么区别?
584
+ * A:BoolHybridArray是本库中的**核心类**,所有函数都是围绕他进行的,但需要`split_index`,`size`,`is_sparse`;
585
+ BoolHybridArr是一个**函数**,用于把一个可迭代对象转为`BoolHybridArray`类
586
+ * Q:为什么不建议把太大的本类型数组打印?
587
+ * A:虽然本类型数组省内存,但字符串不省内存,一个`True`要4字节,一个`False`要5字节,连逗号都要占1字节(`numpy.ndarray`:我都比字符串省内存)
412
588
 
413
589
  ## 源代码和原理
414
590
 
415
- 请见https://code.xdf.cn/freecode/editor?no=80cd07aa023fb2448069e6d8dd50bb5d&type=2&org=code
591
+ 请见[来看看我自己的布尔数组吧!](https://code.xdf.cn/freecode/editor?no=80cd07aa023fb2448069e6d8dd50bb5d&type=2&org=code)
416
592
 
417
593
  ## 许可证
418
594
 
419
595
  本项目采用**MIT许可证**,详情参见**LICENSE文件**。
596
+
@@ -0,0 +1,10 @@
1
+ bool_hybrid_array/__init__.py,sha256=9iOkIP63rPW5zyyePdZgdMe76_WCN2N-x1wfmN10hM8,1660
2
+ bool_hybrid_array/__main__.py,sha256=3MsUAXMj6Pe1EzP7YreuUePbXZeQvFSCnejnTeS42kU,8324
3
+ bool_hybrid_array/core.py,sha256=plA-XljlNvxmJ1KdH6Y67oLbV2B4xxnqRwj5w7vDl-g,36797
4
+ bool_hybrid_array/秘密.md,sha256=Ii2NvXmv-Ktu04zJsGLcQZvlzT4gOatByE4B2wTK1Ks,48
5
+ bool_hybrid_array/int_array/__init__.py,sha256=EnjBonyL35YKDTtQ2g6tnrf4tTKEt5k-EAEbqLRuptI,8548
6
+ bool_hybrid_array-9.10.19.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
7
+ bool_hybrid_array-9.10.19.dist-info/METADATA,sha256=E-BM4yONmNrRbjs9eMxxes2kMPTEvcFzgtngnicKBbc,23380
8
+ bool_hybrid_array-9.10.19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
9
+ bool_hybrid_array-9.10.19.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
10
+ bool_hybrid_array-9.10.19.dist-info/RECORD,,
@@ -1,7 +0,0 @@
1
- bool_hybrid_array/__init__.py,sha256=dvpskBftpmdch7r48IKuOQXtZiBZTCFyAeDRY5U5Nv8,460
2
- bool_hybrid_array/core.py,sha256=t4lDE8mKecPcGm27WbLdrYE1ZAObptjxzvpHeKnus6M,26982
3
- bool_hybrid_array-9.6.4.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
4
- bool_hybrid_array-9.6.4.dist-info/METADATA,sha256=PmTtG-YOXJfo4NSp84r7bJo9d8wr9zN8kijPhFSwD94,15551
5
- bool_hybrid_array-9.6.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
6
- bool_hybrid_array-9.6.4.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
7
- bool_hybrid_array-9.6.4.dist-info/RECORD,,