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.
- bool_hybrid_array/__init__.py +35 -4
- bool_hybrid_array/__main__.py +284 -0
- bool_hybrid_array/core.py +313 -67
- bool_hybrid_array/int_array/__init__.py +203 -0
- bool_hybrid_array//321/207/320/267/320/250/321/205/320/277/320/226.md +2 -0
- {bool_hybrid_array-9.6.4.dist-info → bool_hybrid_array-9.10.19.dist-info}/METADATA +210 -33
- bool_hybrid_array-9.10.19.dist-info/RECORD +10 -0
- bool_hybrid_array-9.6.4.dist-info/RECORD +0 -7
- {bool_hybrid_array-9.6.4.dist-info → bool_hybrid_array-9.10.19.dist-info}/WHEEL +0 -0
- {bool_hybrid_array-9.6.4.dist-info → bool_hybrid_array-9.10.19.dist-info}/licenses/LICENSE +0 -0
- {bool_hybrid_array-9.6.4.dist-info → bool_hybrid_array-9.10.19.dist-info}/top_level.txt +0 -0
|
@@ -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
|
|
@@ -1,24 +1,39 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bool-hybrid-array
|
|
3
|
-
Version: 9.
|
|
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
|
-
|
|
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
|
|
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=)不好意思
|
|
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
|
-
'''当处理动态变化的布尔数组(如频繁增删元素)时,建议在关键操作后调用
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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+尝试修复
|
|
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
|
-
|
|
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
|
-
|
|
481
|
+
- --9.0.0--:详情见上
|
|
374
482
|
* **9.0.1**:小更新,优化optimize方法
|
|
375
|
-
* **9.1.0**:新增二维数组的optimize与
|
|
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 '
|
|
378
|
-
* **9.1.3**:修复9.1.2版本中的NameError: name '
|
|
379
|
-
* **9.2.0**:详情自己发现,提示:看看iter(arr)的返回值类型、调用一下二维数组的optimize、看看
|
|
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**:可以使用
|
|
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
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
BoolHybridArr
|
|
410
|
-
|
|
411
|
-
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|