bool-hybrid-array 9.10.11__py3-none-any.whl → 9.10.13__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 +1 -1
- bool_hybrid_array/__main__.py +15 -3
- bool_hybrid_array/core.py +2 -1
- bool_hybrid_array/int_array/__init__.py +91 -11
- {bool_hybrid_array-9.10.11.dist-info → bool_hybrid_array-9.10.13.dist-info}/METADATA +18 -3
- bool_hybrid_array-9.10.13.dist-info/RECORD +10 -0
- bool_hybrid_array-9.10.11.dist-info/RECORD +0 -10
- {bool_hybrid_array-9.10.11.dist-info → bool_hybrid_array-9.10.13.dist-info}/WHEEL +0 -0
- {bool_hybrid_array-9.10.11.dist-info → bool_hybrid_array-9.10.13.dist-info}/licenses/LICENSE +0 -0
- {bool_hybrid_array-9.10.11.dist-info → bool_hybrid_array-9.10.13.dist-info}/top_level.txt +0 -0
bool_hybrid_array/__init__.py
CHANGED
bool_hybrid_array/__main__.py
CHANGED
|
@@ -266,7 +266,19 @@ except:print("请先安装numba库!!!")
|
|
|
266
266
|
|
|
267
267
|
#int_array模块(9.10.10新增):
|
|
268
268
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
269
|
+
max_num = (1 << 256) - 1
|
|
270
|
+
min_num = -max_num
|
|
271
|
+
|
|
272
|
+
# 1. IntHybridArray:257位完美存储
|
|
273
|
+
arr_hybrid = int_array.IntHybridArray([max_num, min_num, 123456], bit_length=257)
|
|
274
|
+
print("✅ IntHybridArray存储结果:")
|
|
275
|
+
print(f"最大值:{arr_hybrid[0]}")
|
|
276
|
+
print(f"最小值:{arr_hybrid[1]}")
|
|
277
|
+
|
|
278
|
+
# 2. NumPy:用最大的int64尝试存储(必然失败)
|
|
279
|
+
try:
|
|
280
|
+
arr_np = np.array([max_num, min_num, 123456], dtype=np.int64)
|
|
281
|
+
print("\n❌ NumPy存储结果:", arr_np)
|
|
282
|
+
except OverflowError as e:
|
|
283
|
+
print(f"\n❌ NumPy存储失败:{e}")
|
|
272
284
|
|
bool_hybrid_array/core.py
CHANGED
|
@@ -410,7 +410,8 @@ class BoolHybridArray(MutableSequence,Exception,metaclass=ResurrectMeta):
|
|
|
410
410
|
def __copy__(self) -> BoolHybridArray:
|
|
411
411
|
return self.copy()
|
|
412
412
|
def find(self,value):
|
|
413
|
-
|
|
413
|
+
from .int_array import IntHybridArray
|
|
414
|
+
return IntHybridArray([i for i in range(len(self)) if self[i]==value])
|
|
414
415
|
def extend(self, iterable:Iterable) -> None:
|
|
415
416
|
if isinstance(iterable, (Iterator, Generator, map)):
|
|
416
417
|
iterable,copy = itertools.tee(iterable, 2)
|
|
@@ -8,7 +8,8 @@ class IntBitTag(BHA_Bool, metaclass=ResurrectMeta):
|
|
|
8
8
|
__repr__ = __str__
|
|
9
9
|
|
|
10
10
|
class IntHybridArray(BoolHybridArray):
|
|
11
|
-
def __init__(self, int_array: list[int], bit_length: int = 8):
|
|
11
|
+
def __init__(self, int_array: list[int], bit_length: int = 8, Type = int):
|
|
12
|
+
self.Type = Type
|
|
12
13
|
self.bit_length = bit_length
|
|
13
14
|
bool_data = []
|
|
14
15
|
max_required_bits = 1
|
|
@@ -92,9 +93,10 @@ class IntHybridArray(BoolHybridArray):
|
|
|
92
93
|
if block_end > self.size:
|
|
93
94
|
raise IndexError("索引超出范围")
|
|
94
95
|
bit_chunk = [super().__getitem__(j) for j in range(block_start, block_end)]
|
|
95
|
-
return self.to_int(bit_chunk)
|
|
96
|
+
return self.Type(self.to_int(bit_chunk))
|
|
96
97
|
|
|
97
98
|
def __setitem__(self, key, value):
|
|
99
|
+
|
|
98
100
|
value = int(value)
|
|
99
101
|
if isinstance(key, slice):
|
|
100
102
|
start, stop, step = key.indices(len(self))
|
|
@@ -146,16 +148,94 @@ class IntHybridArray(BoolHybridArray):
|
|
|
146
148
|
bool_data = [sign_bit] + num_bits
|
|
147
149
|
for bit_idx in range(self.bit_length):
|
|
148
150
|
super().__setitem__(block_start + bit_idx, bool_data[bit_idx])
|
|
149
|
-
|
|
151
|
+
def insert(self, index, value):
|
|
152
|
+
value = int(value)
|
|
153
|
+
index = index if index >= 0 else index + len(self)
|
|
154
|
+
if not (0 <= index <= len(self)):
|
|
155
|
+
raise IndexError("插入索引超出范围")
|
|
156
|
+
if value == 0:
|
|
157
|
+
required_bits = 1
|
|
158
|
+
else:
|
|
159
|
+
required_bits = 1 + abs(value).bit_length()
|
|
160
|
+
need_resize = required_bits > self.bit_length
|
|
161
|
+
old_data = list(self) if need_resize else None
|
|
162
|
+
if need_resize:
|
|
163
|
+
self.bit_length = required_bits
|
|
164
|
+
self.total_bits = 0
|
|
165
|
+
super().__init__(0, 0, False, IntBitTag, False)
|
|
166
|
+
for num in old_data[:index]:
|
|
167
|
+
self._add_single_num(num)
|
|
168
|
+
self._add_single_num(value)
|
|
169
|
+
for num in old_data[index:]:
|
|
170
|
+
self._add_single_num(num)
|
|
171
|
+
else:
|
|
172
|
+
insert_bit_start = index * self.bit_length
|
|
173
|
+
if value >= 0:
|
|
174
|
+
sign_bit = False
|
|
175
|
+
num_bits = [bool((num >> i) & 1) for i in range(self.bit_length - 1)]
|
|
176
|
+
else:
|
|
177
|
+
sign_bit = True
|
|
178
|
+
abs_num = abs(value)
|
|
179
|
+
num_bits = [not bool((abs_num >> i) & 1) for i in range(self.bit_length - 1)]
|
|
180
|
+
carry = 1
|
|
181
|
+
for j in range(len(num_bits)):
|
|
182
|
+
if carry:
|
|
183
|
+
num_bits[j] = not num_bits[j]
|
|
184
|
+
carry = 0 if num_bits[j] else 1
|
|
185
|
+
bool_data = [sign_bit] + num_bits
|
|
186
|
+
for i in range(self.bit_length):
|
|
187
|
+
super().insert(insert_bit_start + i, bool_data[i])
|
|
188
|
+
self.total_bits += self.bit_length
|
|
189
|
+
def append(self,v):
|
|
190
|
+
v = int(v)
|
|
191
|
+
req_bits = 1 + abs(v).bit_length() if v != 0 else 1
|
|
192
|
+
if req_bits > self.bit_length:
|
|
193
|
+
old_data = list(self)
|
|
194
|
+
self.bit_length = req_bits
|
|
195
|
+
self.clear()
|
|
196
|
+
self.extend(old_data)
|
|
197
|
+
self.total_bits += self.bit_length
|
|
198
|
+
self[-1] = v
|
|
150
199
|
def __iter__(self):
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
200
|
+
return BHA_Iterator(map(self.__getitem__,range(len(self))))
|
|
201
|
+
def clear(self):
|
|
202
|
+
self.total_bits = 0
|
|
203
|
+
super().__init__(0, 0, False, IntBitTag, False)
|
|
204
|
+
self.bit_length = 8
|
|
157
205
|
def __str__(self):
|
|
158
206
|
return f"IntHybridArray([{', '.join(map(str, self))}])"
|
|
159
|
-
|
|
207
|
+
__repr__ = __str__
|
|
208
|
+
def __delitem__(self, index: int = -1):
|
|
209
|
+
index = index if index >= 0 else index + len(self)
|
|
210
|
+
if not (0 <= index < len(self)):
|
|
211
|
+
raise IndexError("删除索引超出范围")
|
|
212
|
+
target_num = self[index]
|
|
213
|
+
pop_bit_start = index * self.bit_length
|
|
214
|
+
pop_bit_end = pop_bit_start + self.bit_length
|
|
215
|
+
for _ in range(self.bit_length):
|
|
216
|
+
super().__delitem__(pop_bit_start)
|
|
217
|
+
self.total_bits -= self.bit_length
|
|
160
218
|
def __len__(self):
|
|
161
|
-
return self.total_bits // self.bit_length
|
|
219
|
+
return self.total_bits // self.bit_length
|
|
220
|
+
def index(self, value):
|
|
221
|
+
value = int(value)
|
|
222
|
+
x = f"{value} 不在 IntHybridArray 中"
|
|
223
|
+
for idx in range(len(self)+2>>2):
|
|
224
|
+
if self[idx] == value:
|
|
225
|
+
return idx
|
|
226
|
+
elif self[-idx] == value:
|
|
227
|
+
x = len(self)-idx
|
|
228
|
+
if x != f"{value} 不在 IntHybridArray 中":
|
|
229
|
+
return x
|
|
230
|
+
raise ValueError(x)
|
|
231
|
+
def rindex(self, value):
|
|
232
|
+
value = int(value)
|
|
233
|
+
x = f"{value} 不在 IntHybridArray 中"
|
|
234
|
+
for idx in range(len(self)+2>>2):
|
|
235
|
+
if self[-idx] == value:
|
|
236
|
+
return -idx
|
|
237
|
+
elif self[idx] == value:
|
|
238
|
+
x = -(len(self)-idx)
|
|
239
|
+
if x != f"{value} 不在 IntHybridArray 中":
|
|
240
|
+
return x
|
|
241
|
+
raise ValueError(x)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bool-hybrid-array
|
|
3
|
-
Version: 9.10.
|
|
3
|
+
Version: 9.10.13
|
|
4
4
|
Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
|
|
5
5
|
Home-page: https://github.com/BKsell/bool-hybrid-array
|
|
6
6
|
Author: 蔡靖杰
|
|
@@ -394,7 +394,21 @@ except:print("请先安装numba库!!!")
|
|
|
394
394
|
|
|
395
395
|
#int_array模块(9.10.10新增):
|
|
396
396
|
|
|
397
|
-
|
|
397
|
+
max_num = (1 << 256) - 1
|
|
398
|
+
min_num = -max_num
|
|
399
|
+
|
|
400
|
+
# 1. IntHybridArray:257位完美存储
|
|
401
|
+
arr_hybrid = int_array.IntHybridArray([max_num, min_num, 123456], bit_length=257)
|
|
402
|
+
print("✅ IntHybridArray存储结果:")
|
|
403
|
+
print(f"最大值:{arr_hybrid[0]}")
|
|
404
|
+
print(f"最小值:{arr_hybrid[1]}")
|
|
405
|
+
|
|
406
|
+
# 2. NumPy:用最大的int64尝试存储(必然失败)
|
|
407
|
+
try:
|
|
408
|
+
arr_np = np.array([max_num, min_num, 123456], dtype=np.int64)
|
|
409
|
+
print("\n❌ NumPy存储结果:", arr_np)
|
|
410
|
+
except OverflowError as e:
|
|
411
|
+
print(f"\n❌ NumPy存储失败:{e}")
|
|
398
412
|
|
|
399
413
|
```
|
|
400
414
|
|
|
@@ -542,7 +556,8 @@ arr = int_array.IntHybridArray([100,-27623,18276,-32165])
|
|
|
542
556
|
* **9.10.9**:修复9.10.8版本中的NameError错误
|
|
543
557
|
* **9.10.10**:新增int_array模块
|
|
544
558
|
* **9.10.11**:修复NameError: name 'int_array' is not defined. Did you mean: 'bytearray'?的错误
|
|
545
|
-
|
|
559
|
+
* **9.10.12**:把find方法的返回值改为IntHybridArray
|
|
560
|
+
* **9.10.13**:给IntHybridArray新增多种列表操作
|
|
546
561
|
|
|
547
562
|
|
|
548
563
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
bool_hybrid_array/__init__.py,sha256=3Un6yG5b9peKnh8G5hXauOSf5NigC42BRA72cPQW8SU,793
|
|
2
|
+
bool_hybrid_array/__main__.py,sha256=3MsUAXMj6Pe1EzP7YreuUePbXZeQvFSCnejnTeS42kU,8324
|
|
3
|
+
bool_hybrid_array/core.py,sha256=zp4jam5xC_CZvVVkmfT6fPAhBzf4-wspDnYuz0z49Ys,36578
|
|
4
|
+
bool_hybrid_array/秘密.md,sha256=Ii2NvXmv-Ktu04zJsGLcQZvlzT4gOatByE4B2wTK1Ks,48
|
|
5
|
+
bool_hybrid_array/int_array/__init__.py,sha256=yZXd8I-kSKCGeRiMn8kfs9afRXWMmEmmoM9qME9Jv84,10173
|
|
6
|
+
bool_hybrid_array-9.10.13.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
|
|
7
|
+
bool_hybrid_array-9.10.13.dist-info/METADATA,sha256=C1Vgk-1lS4zLjtsTgDufdx-7DUur43Zc_PdOPlWV5ho,22623
|
|
8
|
+
bool_hybrid_array-9.10.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
9
|
+
bool_hybrid_array-9.10.13.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
|
|
10
|
+
bool_hybrid_array-9.10.13.dist-info/RECORD,,
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
bool_hybrid_array/__init__.py,sha256=IqtYvdH7w00YYmTgbQ9Q2DKMKIQoGM9728UQ0JOSox8,793
|
|
2
|
-
bool_hybrid_array/__main__.py,sha256=xb4p6L-JlVWor0CVVKqjoxKVH3YvA8pfRTBG4AFHqQU,7833
|
|
3
|
-
bool_hybrid_array/core.py,sha256=zcqPqb6AhUFqzb0PPXQtisXpXc2Zd50Xsh8ooOvpwO0,36526
|
|
4
|
-
bool_hybrid_array/秘密.md,sha256=Ii2NvXmv-Ktu04zJsGLcQZvlzT4gOatByE4B2wTK1Ks,48
|
|
5
|
-
bool_hybrid_array/int_array/__init__.py,sha256=1ysgXyfJcmSPK4Fs3Qd7JGlESwXyYn9WsPVaI6LtrxA,6872
|
|
6
|
-
bool_hybrid_array-9.10.11.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
|
|
7
|
-
bool_hybrid_array-9.10.11.dist-info/METADATA,sha256=LY4eVuUqmSFXk_ay6uzbZ0YmKW2SSxaIFMBF13xg4TY,22008
|
|
8
|
-
bool_hybrid_array-9.10.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
9
|
-
bool_hybrid_array-9.10.11.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
|
|
10
|
-
bool_hybrid_array-9.10.11.dist-info/RECORD,,
|
|
File without changes
|
{bool_hybrid_array-9.10.11.dist-info → bool_hybrid_array-9.10.13.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|